agentic-qe 1.7.0 → 1.8.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/.claude/skills/sherlock-review/SKILL.md +786 -0
- package/CHANGELOG.md +531 -0
- package/README.md +37 -21
- package/dist/agents/BaseAgent.d.ts +8 -10
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +41 -43
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +2 -2
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/LearningAgent.d.ts +2 -2
- package/dist/agents/LearningAgent.d.ts.map +1 -1
- package/dist/agents/LearningAgent.js +4 -4
- package/dist/agents/LearningAgent.js.map +1 -1
- package/dist/agents/TestExecutorAgent.d.ts +9 -0
- package/dist/agents/TestExecutorAgent.d.ts.map +1 -1
- package/dist/agents/TestExecutorAgent.js +60 -0
- package/dist/agents/TestExecutorAgent.js.map +1 -1
- package/dist/agents/examples/batchAnalyze.d.ts +252 -0
- package/dist/agents/examples/batchAnalyze.d.ts.map +1 -0
- package/dist/agents/examples/batchAnalyze.js +259 -0
- package/dist/agents/examples/batchAnalyze.js.map +1 -0
- package/dist/agents/examples/batchGenerate.d.ts +153 -0
- package/dist/agents/examples/batchGenerate.d.ts.map +1 -0
- package/dist/agents/examples/batchGenerate.js +166 -0
- package/dist/agents/examples/batchGenerate.js.map +1 -0
- package/dist/agents/generateWithPII.d.ts +128 -0
- package/dist/agents/generateWithPII.d.ts.map +1 -0
- package/dist/agents/generateWithPII.js +175 -0
- package/dist/agents/generateWithPII.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -3
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +51 -46
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learn/index.d.ts +4 -0
- package/dist/cli/commands/learn/index.d.ts.map +1 -1
- package/dist/cli/commands/learn/index.js +57 -0
- package/dist/cli/commands/learn/index.js.map +1 -1
- package/dist/cli/index.js +14 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/memory/AgentDBManager.d.ts +5 -0
- package/dist/core/memory/AgentDBManager.d.ts.map +1 -1
- package/dist/core/memory/AgentDBManager.js +19 -1
- package/dist/core/memory/AgentDBManager.js.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.d.ts +8 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.js +74 -17
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
- package/dist/core/memory/ReasoningBankAdapter.d.ts +4 -0
- package/dist/core/memory/ReasoningBankAdapter.d.ts.map +1 -1
- package/dist/core/memory/ReasoningBankAdapter.js +20 -0
- package/dist/core/memory/ReasoningBankAdapter.js.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts +8 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +33 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/learning/ImprovementLoop.js +2 -2
- package/dist/learning/ImprovementLoop.js.map +1 -1
- package/dist/learning/LearningEngine.d.ts +11 -7
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +156 -72
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.d.ts +83 -0
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.js +130 -0
- package/dist/mcp/handlers/filtered/coverage-analyzer-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.d.ts +58 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.js +84 -0
- package/dist/mcp/handlers/filtered/flaky-detector-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/index.d.ts +47 -0
- package/dist/mcp/handlers/filtered/index.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/index.js +63 -0
- package/dist/mcp/handlers/filtered/index.js.map +1 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.d.ts +57 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.js +83 -0
- package/dist/mcp/handlers/filtered/performance-tester-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.d.ts +57 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.js +93 -0
- package/dist/mcp/handlers/filtered/quality-assessor-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.d.ts +54 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.js +73 -0
- package/dist/mcp/handlers/filtered/security-scanner-filtered.js.map +1 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.d.ts +61 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.d.ts.map +1 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.js +117 -0
- package/dist/mcp/handlers/filtered/test-executor-filtered.js.map +1 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.js +2 -2
- package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -1
- package/dist/mcp/tools/deprecated.d.ts +8 -8
- package/dist/scripts/backup-helper.d.ts +64 -0
- package/dist/scripts/backup-helper.d.ts.map +1 -0
- package/dist/scripts/backup-helper.js +251 -0
- package/dist/scripts/backup-helper.js.map +1 -0
- package/dist/scripts/migrate-with-backup.d.ts +15 -0
- package/dist/scripts/migrate-with-backup.d.ts.map +1 -0
- package/dist/scripts/migrate-with-backup.js +194 -0
- package/dist/scripts/migrate-with-backup.js.map +1 -0
- package/dist/security/pii-tokenization.d.ts +216 -0
- package/dist/security/pii-tokenization.d.ts.map +1 -0
- package/dist/security/pii-tokenization.js +325 -0
- package/dist/security/pii-tokenization.js.map +1 -0
- package/dist/utils/EmbeddingGenerator.d.ts +35 -0
- package/dist/utils/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/utils/EmbeddingGenerator.js +72 -0
- package/dist/utils/EmbeddingGenerator.js.map +1 -0
- package/dist/utils/batch-operations.d.ts +215 -0
- package/dist/utils/batch-operations.d.ts.map +1 -0
- package/dist/utils/batch-operations.js +266 -0
- package/dist/utils/batch-operations.js.map +1 -0
- package/dist/utils/filtering.d.ts +180 -0
- package/dist/utils/filtering.d.ts.map +1 -0
- package/dist/utils/filtering.js +288 -0
- package/dist/utils/filtering.js.map +1 -0
- package/dist/utils/prompt-cache-examples.d.ts +111 -0
- package/dist/utils/prompt-cache-examples.d.ts.map +1 -0
- package/dist/utils/prompt-cache-examples.js +416 -0
- package/dist/utils/prompt-cache-examples.js.map +1 -0
- package/dist/utils/prompt-cache.d.ts +305 -0
- package/dist/utils/prompt-cache.d.ts.map +1 -0
- package/dist/utils/prompt-cache.js +448 -0
- package/dist/utils/prompt-cache.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Batch Coverage Analysis Example
|
|
4
|
+
*
|
|
5
|
+
* Demonstrates using the BatchOperationManager to analyze coverage
|
|
6
|
+
* for multiple modules/packages in parallel.
|
|
7
|
+
*
|
|
8
|
+
* Performance Improvement:
|
|
9
|
+
* - Sequential: 10 modules × 1s = 10s
|
|
10
|
+
* - Batched: max(1s) with 5 concurrent = ~2s
|
|
11
|
+
* - Speedup: 5x faster
|
|
12
|
+
*
|
|
13
|
+
* @module agents/examples/batchAnalyze
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.CoverageMonitor = void 0;
|
|
17
|
+
exports.analyzeCoverageForModules = analyzeCoverageForModules;
|
|
18
|
+
exports.analyzeCoverageWithPriority = analyzeCoverageWithPriority;
|
|
19
|
+
exports.analyzeCoverageDelta = analyzeCoverageDelta;
|
|
20
|
+
const batch_operations_1 = require("../../utils/batch-operations");
|
|
21
|
+
/**
|
|
22
|
+
* Batch analyze coverage for multiple modules
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const modules = [
|
|
27
|
+
* { moduleName: 'auth', coverageDataPath: 'coverage/auth/lcov.info' },
|
|
28
|
+
* { moduleName: 'api', coverageDataPath: 'coverage/api/lcov.info' },
|
|
29
|
+
* { moduleName: 'ui', coverageDataPath: 'coverage/ui/lcov.info' }
|
|
30
|
+
* ];
|
|
31
|
+
*
|
|
32
|
+
* const result = await analyzeCoverageForModules(modules, {
|
|
33
|
+
* threshold: 80,
|
|
34
|
+
* maxConcurrent: 5,
|
|
35
|
+
* includeDetails: true,
|
|
36
|
+
* onProgress: (completed, total, module) => {
|
|
37
|
+
* console.log(`Analyzed ${completed}/${total}: ${module}`);
|
|
38
|
+
* }
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* console.log(`Analyzed ${result.results.length} modules`);
|
|
42
|
+
* console.log(`Success rate: ${result.successRate * 100}%`);
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
async function analyzeCoverageForModules(modules, config) {
|
|
46
|
+
const batchManager = new batch_operations_1.BatchOperationManager();
|
|
47
|
+
const { threshold = 80, maxConcurrent = 5, timeout = 60000, retryOnError = true, includeDetails = false, onProgress, } = config;
|
|
48
|
+
// Handler function for single module analysis
|
|
49
|
+
const analyzeModule = async (input) => {
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
// This would call your actual coverage analysis service
|
|
52
|
+
const coverage = await analyzeCoverageData({
|
|
53
|
+
moduleName: input.moduleName,
|
|
54
|
+
coverageDataPath: input.coverageDataPath,
|
|
55
|
+
threshold: input.config?.threshold || threshold,
|
|
56
|
+
includeDetails,
|
|
57
|
+
});
|
|
58
|
+
// Find gaps (files below threshold)
|
|
59
|
+
const gaps = findCoverageGaps(coverage, threshold);
|
|
60
|
+
// Generate recommendations
|
|
61
|
+
const recommendations = includeDetails
|
|
62
|
+
? generateRecommendations(gaps)
|
|
63
|
+
: undefined;
|
|
64
|
+
const analysisTime = Date.now() - startTime;
|
|
65
|
+
return {
|
|
66
|
+
moduleName: input.moduleName,
|
|
67
|
+
coverage: coverage.summary,
|
|
68
|
+
gaps,
|
|
69
|
+
filesAnalyzed: coverage.files.length,
|
|
70
|
+
analysisTime,
|
|
71
|
+
recommendations,
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
// Execute batch analysis
|
|
75
|
+
return batchManager.batchExecute(modules, analyzeModule, {
|
|
76
|
+
maxConcurrent,
|
|
77
|
+
timeout,
|
|
78
|
+
retryOnError,
|
|
79
|
+
maxRetries: 3,
|
|
80
|
+
failFast: false,
|
|
81
|
+
onProgress: (completed, total) => {
|
|
82
|
+
const currentModule = modules[completed - 1]?.moduleName || 'unknown';
|
|
83
|
+
onProgress?.(completed, total, currentModule);
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Placeholder for actual coverage analysis implementation
|
|
89
|
+
*/
|
|
90
|
+
async function analyzeCoverageData(params) {
|
|
91
|
+
// This would integrate with your CoverageAnalyzerAgent
|
|
92
|
+
throw new Error('Not implemented - integrate with CoverageAnalyzerAgent');
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Find coverage gaps below threshold
|
|
96
|
+
*/
|
|
97
|
+
function findCoverageGaps(coverage, threshold) {
|
|
98
|
+
return coverage.files
|
|
99
|
+
.filter((file) => file.coverage < threshold)
|
|
100
|
+
.map((file) => {
|
|
101
|
+
const priority = file.coverage < threshold - 20
|
|
102
|
+
? 'high'
|
|
103
|
+
: file.coverage < threshold - 10
|
|
104
|
+
? 'medium'
|
|
105
|
+
: 'low';
|
|
106
|
+
return {
|
|
107
|
+
filePath: file.path,
|
|
108
|
+
coverage: file.coverage,
|
|
109
|
+
uncoveredLines: [], // Would be populated from actual coverage data
|
|
110
|
+
priority,
|
|
111
|
+
};
|
|
112
|
+
})
|
|
113
|
+
.sort((a, b) => a.coverage - b.coverage); // Worst coverage first
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Generate improvement recommendations
|
|
117
|
+
*/
|
|
118
|
+
function generateRecommendations(gaps) {
|
|
119
|
+
const recommendations = [];
|
|
120
|
+
if (gaps.length === 0) {
|
|
121
|
+
return ['All files meet coverage threshold'];
|
|
122
|
+
}
|
|
123
|
+
const highPriorityGaps = gaps.filter((g) => g.priority === 'high');
|
|
124
|
+
if (highPriorityGaps.length > 0) {
|
|
125
|
+
recommendations.push(`Focus on ${highPriorityGaps.length} high-priority files with <60% coverage`);
|
|
126
|
+
}
|
|
127
|
+
const avgCoverage = gaps.reduce((sum, g) => sum + g.coverage, 0) / gaps.length;
|
|
128
|
+
if (avgCoverage < 50) {
|
|
129
|
+
recommendations.push('Consider implementing integration tests to improve overall coverage');
|
|
130
|
+
}
|
|
131
|
+
if (gaps.length > 10) {
|
|
132
|
+
recommendations.push('Use batch test generation to address multiple gaps simultaneously');
|
|
133
|
+
}
|
|
134
|
+
return recommendations;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Batch analyze coverage with gap prioritization
|
|
138
|
+
*
|
|
139
|
+
* Analyzes all modules and returns a prioritized list of files to test.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* const result = await analyzeCoverageWithPriority(modules, {
|
|
144
|
+
* threshold: 80,
|
|
145
|
+
* topN: 20 // Return top 20 gaps
|
|
146
|
+
* });
|
|
147
|
+
*
|
|
148
|
+
* console.log('Top coverage gaps to address:');
|
|
149
|
+
* result.prioritizedGaps.forEach((gap, idx) => {
|
|
150
|
+
* console.log(`${idx + 1}. ${gap.filePath} (${gap.coverage}%)`);
|
|
151
|
+
* });
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
async function analyzeCoverageWithPriority(modules, config) {
|
|
155
|
+
const result = await analyzeCoverageForModules(modules, config);
|
|
156
|
+
// Aggregate all gaps
|
|
157
|
+
const allGaps = result.results.flatMap((r) => r.gaps);
|
|
158
|
+
// Sort by priority and coverage
|
|
159
|
+
const prioritizedGaps = allGaps
|
|
160
|
+
.sort((a, b) => {
|
|
161
|
+
const priorityOrder = { high: 0, medium: 1, low: 2 };
|
|
162
|
+
const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
163
|
+
return priorityDiff !== 0 ? priorityDiff : a.coverage - b.coverage;
|
|
164
|
+
})
|
|
165
|
+
.slice(0, config.topN || 50);
|
|
166
|
+
// Calculate overall coverage
|
|
167
|
+
const totalCoverage = result.results.reduce((sum, r) => ({
|
|
168
|
+
lines: sum.lines + r.coverage.lines,
|
|
169
|
+
branches: sum.branches + r.coverage.branches,
|
|
170
|
+
functions: sum.functions + r.coverage.functions,
|
|
171
|
+
statements: sum.statements + r.coverage.statements,
|
|
172
|
+
}), { lines: 0, branches: 0, functions: 0, statements: 0 });
|
|
173
|
+
const count = result.results.length || 1;
|
|
174
|
+
const overallCoverage = {
|
|
175
|
+
lines: totalCoverage.lines / count,
|
|
176
|
+
branches: totalCoverage.branches / count,
|
|
177
|
+
functions: totalCoverage.functions / count,
|
|
178
|
+
statements: totalCoverage.statements / count,
|
|
179
|
+
};
|
|
180
|
+
return {
|
|
181
|
+
...result,
|
|
182
|
+
prioritizedGaps,
|
|
183
|
+
overallCoverage,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Continuous coverage monitoring with batch analysis
|
|
188
|
+
*
|
|
189
|
+
* Runs coverage analysis at intervals and tracks trends over time.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```typescript
|
|
193
|
+
* const monitor = new CoverageMonitor(modules, {
|
|
194
|
+
* interval: 60000, // 1 minute
|
|
195
|
+
* threshold: 80,
|
|
196
|
+
* onCoverageChange: (current, previous) => {
|
|
197
|
+
* console.log(`Coverage changed: ${previous}% -> ${current}%`);
|
|
198
|
+
* }
|
|
199
|
+
* });
|
|
200
|
+
*
|
|
201
|
+
* await monitor.start();
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
class CoverageMonitor {
|
|
205
|
+
constructor(modules, config) {
|
|
206
|
+
this.modules = modules;
|
|
207
|
+
this.config = config;
|
|
208
|
+
}
|
|
209
|
+
async start() {
|
|
210
|
+
const interval = this.config.interval || 60000;
|
|
211
|
+
// Initial analysis
|
|
212
|
+
await this.runAnalysis();
|
|
213
|
+
// Schedule periodic analysis
|
|
214
|
+
this.intervalId = setInterval(() => {
|
|
215
|
+
this.runAnalysis();
|
|
216
|
+
}, interval);
|
|
217
|
+
}
|
|
218
|
+
stop() {
|
|
219
|
+
if (this.intervalId) {
|
|
220
|
+
clearInterval(this.intervalId);
|
|
221
|
+
this.intervalId = undefined;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async runAnalysis() {
|
|
225
|
+
const result = await analyzeCoverageWithPriority(this.modules, this.config);
|
|
226
|
+
const currentCoverage = result.overallCoverage.lines;
|
|
227
|
+
if (this.previousCoverage !== undefined &&
|
|
228
|
+
this.config.onCoverageChange) {
|
|
229
|
+
this.config.onCoverageChange(currentCoverage, this.previousCoverage);
|
|
230
|
+
}
|
|
231
|
+
this.previousCoverage = currentCoverage;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
exports.CoverageMonitor = CoverageMonitor;
|
|
235
|
+
/**
|
|
236
|
+
* Analyze coverage delta between two points in time
|
|
237
|
+
*
|
|
238
|
+
* Useful for PR validation to ensure coverage doesn't decrease.
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```typescript
|
|
242
|
+
* const delta = await analyzeCoverageDelta(
|
|
243
|
+
* modules,
|
|
244
|
+
* 'baseline-coverage.json',
|
|
245
|
+
* 'current-coverage.json',
|
|
246
|
+
* { threshold: 80 }
|
|
247
|
+
* );
|
|
248
|
+
*
|
|
249
|
+
* if (delta.overallChange < 0) {
|
|
250
|
+
* console.error('Coverage decreased!');
|
|
251
|
+
* process.exit(1);
|
|
252
|
+
* }
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
async function analyzeCoverageDelta(modules, baselinePath, currentPath, config) {
|
|
256
|
+
// This would load baseline and current coverage, then compare
|
|
257
|
+
throw new Error('Not implemented - integrate with coverage comparison logic');
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=batchAnalyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchAnalyze.js","sourceRoot":"","sources":["../../../src/agents/examples/batchAnalyze.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AA2KH,8DA6DC;AAiHD,kEAsDC;AAuFD,oDAkBC;AAtfD,mEAAuF;AAiJvF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACI,KAAK,UAAU,yBAAyB,CAC7C,OAA8B,EAC9B,MAA0B;IAE1B,MAAM,YAAY,GAAG,IAAI,wCAAqB,EAAE,CAAC;IAEjD,MAAM,EACJ,SAAS,GAAG,EAAE,EACd,aAAa,GAAG,CAAC,EACjB,OAAO,GAAG,KAAK,EACf,YAAY,GAAG,IAAI,EACnB,cAAc,GAAG,KAAK,EACtB,UAAU,GACX,GAAG,MAAM,CAAC;IAEX,8CAA8C;IAC9C,MAAM,aAAa,GAAG,KAAK,EACzB,KAA0B,EACK,EAAE;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,wDAAwD;QACxD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC;YACzC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,SAAS;YAC/C,cAAc;SACf,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEnD,2BAA2B;QAC3B,MAAM,eAAe,GAAG,cAAc;YACpC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC;YAC/B,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE5C,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,QAAQ,CAAC,OAAO;YAC1B,IAAI;YACJ,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;YACpC,YAAY;YACZ,eAAe;SAChB,CAAC;IACJ,CAAC,CAAC;IAEF,yBAAyB;IACzB,OAAO,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE;QACvD,aAAa;QACb,OAAO;QACP,YAAY;QACZ,UAAU,EAAE,CAAC;QACb,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,UAAU,IAAI,SAAS,CAAC;YACtE,UAAU,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QAChD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,MAKlC;IAcC,uDAAuD;IACvD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,QAMC,EACD,SAAiB;IAEjB,OAAO,QAAQ,CAAC,KAAK;SAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;SAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,GAAG,SAAS,GAAG,EAAE;YAC5B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,GAAG,EAAE;gBAChC,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,KAAK,CAAC;QAEZ,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,EAAE,EAAE,+CAA+C;YACnE,QAAQ;SACT,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAuB;AACrE,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,IAAmB;IAClD,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,mCAAmC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IACnE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,eAAe,CAAC,IAAI,CAClB,YAAY,gBAAgB,CAAC,MAAM,yCAAyC,CAC7E,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GACf,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7D,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;QACrB,eAAe,CAAC,IAAI,CAClB,qEAAqE,CACtE,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACrB,eAAe,CAAC,IAAI,CAClB,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,UAAU,2BAA2B,CAC/C,OAA8B,EAC9B,MAEC;IAYD,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEhE,qBAAqB;IACrB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEtD,gCAAgC;IAChC,MAAM,eAAe,GAAG,OAAO;SAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACrD,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3E,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IACrE,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAE/B,6BAA6B;IAC7B,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK;QACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ;QAC5C,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS;QAC/C,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU;KACnD,CAAC,EACF,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CACvD,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG;QACtB,KAAK,EAAE,aAAa,CAAC,KAAK,GAAG,KAAK;QAClC,QAAQ,EAAE,aAAa,CAAC,QAAQ,GAAG,KAAK;QACxC,SAAS,EAAE,aAAa,CAAC,SAAS,GAAG,KAAK;QAC1C,UAAU,EAAE,aAAa,CAAC,UAAU,GAAG,KAAK;KAC7C,CAAC;IAEF,OAAO;QACL,GAAG,MAAM;QACT,eAAe;QACf,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,eAAe;IAI1B,YACU,OAA8B,EAC9B,MAGP;QAJO,YAAO,GAAP,OAAO,CAAuB;QAC9B,WAAM,GAAN,MAAM,CAGb;IACA,CAAC;IAEJ,KAAK,CAAC,KAAK;QACT,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC;QAE/C,mBAAmB;QACnB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAEzB,6BAA6B;QAC7B,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAE5E,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC;QAErD,IACE,IAAI,CAAC,gBAAgB,KAAK,SAAS;YACnC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAC5B,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAC1C,CAAC;CACF;AA7CD,0CA6CC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAA8B,EAC9B,YAAoB,EACpB,WAAmB,EACnB,MAA0B;IAY1B,8DAA8D;IAC9D,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Test Generation Example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates using the BatchOperationManager to generate tests
|
|
5
|
+
* for multiple files in parallel with automatic retry and timeout handling.
|
|
6
|
+
*
|
|
7
|
+
* Performance Improvement:
|
|
8
|
+
* - Sequential: 3 files × 2s = 6s
|
|
9
|
+
* - Batched: max(2s) with 5 concurrent = ~2s
|
|
10
|
+
* - Speedup: 3x faster
|
|
11
|
+
*
|
|
12
|
+
* @module agents/examples/batchGenerate
|
|
13
|
+
*/
|
|
14
|
+
import { type BatchResult } from '../../utils/batch-operations';
|
|
15
|
+
import type { TestGenerationRequest, TestGenerationResult } from '../TestGeneratorAgent';
|
|
16
|
+
/**
|
|
17
|
+
* Configuration for batch test generation
|
|
18
|
+
*/
|
|
19
|
+
export interface BatchGenerateConfig {
|
|
20
|
+
/**
|
|
21
|
+
* Test framework to use
|
|
22
|
+
*/
|
|
23
|
+
framework: 'jest' | 'vitest' | 'mocha';
|
|
24
|
+
/**
|
|
25
|
+
* Target coverage percentage
|
|
26
|
+
*/
|
|
27
|
+
targetCoverage?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Maximum concurrent file processing
|
|
30
|
+
* @default 5
|
|
31
|
+
*/
|
|
32
|
+
maxConcurrent?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Timeout per file in milliseconds
|
|
35
|
+
* @default 60000 (60 seconds)
|
|
36
|
+
*/
|
|
37
|
+
timeout?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Enable retry on failure
|
|
40
|
+
* @default true
|
|
41
|
+
*/
|
|
42
|
+
retryOnError?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Progress callback
|
|
45
|
+
*/
|
|
46
|
+
onProgress?: (completed: number, total: number, file: string) => void;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Single file test generation input
|
|
50
|
+
*/
|
|
51
|
+
export interface FileGenerationInput {
|
|
52
|
+
/**
|
|
53
|
+
* Path to source file
|
|
54
|
+
*/
|
|
55
|
+
filePath: string;
|
|
56
|
+
/**
|
|
57
|
+
* File content (optional, will read if not provided)
|
|
58
|
+
*/
|
|
59
|
+
content?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Custom configuration for this file
|
|
62
|
+
*/
|
|
63
|
+
config?: Partial<TestGenerationRequest>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Result for a single file
|
|
67
|
+
*/
|
|
68
|
+
export interface FileGenerationResult {
|
|
69
|
+
/**
|
|
70
|
+
* Source file path
|
|
71
|
+
*/
|
|
72
|
+
filePath: string;
|
|
73
|
+
/**
|
|
74
|
+
* Generated test file path
|
|
75
|
+
*/
|
|
76
|
+
testFilePath: string;
|
|
77
|
+
/**
|
|
78
|
+
* Test generation result
|
|
79
|
+
*/
|
|
80
|
+
result: TestGenerationResult;
|
|
81
|
+
/**
|
|
82
|
+
* Generation time in milliseconds
|
|
83
|
+
*/
|
|
84
|
+
generationTime: number;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Batch test generation for multiple files
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const files = [
|
|
92
|
+
* { filePath: 'src/utils/parser.ts' },
|
|
93
|
+
* { filePath: 'src/utils/validator.ts' },
|
|
94
|
+
* { filePath: 'src/utils/formatter.ts' }
|
|
95
|
+
* ];
|
|
96
|
+
*
|
|
97
|
+
* const result = await generateTestsForFiles(files, {
|
|
98
|
+
* framework: 'jest',
|
|
99
|
+
* targetCoverage: 80,
|
|
100
|
+
* maxConcurrent: 5,
|
|
101
|
+
* onProgress: (completed, total, file) => {
|
|
102
|
+
* console.log(`Progress: ${completed}/${total} - ${file}`);
|
|
103
|
+
* }
|
|
104
|
+
* });
|
|
105
|
+
*
|
|
106
|
+
* console.log(`Generated ${result.results.length} test files`);
|
|
107
|
+
* console.log(`Success rate: ${result.successRate * 100}%`);
|
|
108
|
+
* console.log(`Total time: ${result.totalTime}ms`);
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare function generateTestsForFiles(files: FileGenerationInput[], config: BatchGenerateConfig): Promise<BatchResult<FileGenerationResult>>;
|
|
112
|
+
/**
|
|
113
|
+
* Batch generate tests for an entire directory
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```typescript
|
|
117
|
+
* const result = await generateTestsForDirectory('src/utils', {
|
|
118
|
+
* framework: 'jest',
|
|
119
|
+
* pattern: '**\/*.ts',
|
|
120
|
+
* exclude: ['**\/*.test.ts', '**\/*.spec.ts'],
|
|
121
|
+
* maxConcurrent: 5
|
|
122
|
+
* });
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
export declare function generateTestsForDirectory(directory: string, config: BatchGenerateConfig & {
|
|
126
|
+
pattern?: string;
|
|
127
|
+
exclude?: string[];
|
|
128
|
+
}): Promise<BatchResult<FileGenerationResult>>;
|
|
129
|
+
/**
|
|
130
|
+
* Batch generate tests with intelligent prioritization
|
|
131
|
+
*
|
|
132
|
+
* Prioritizes files by:
|
|
133
|
+
* 1. Code complexity (higher first)
|
|
134
|
+
* 2. Current test coverage (lower first)
|
|
135
|
+
* 3. Change frequency (higher first)
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* const result = await generateTestsWithPriority(
|
|
140
|
+
* [
|
|
141
|
+
* { filePath: 'src/complex.ts', complexity: 15, coverage: 20 },
|
|
142
|
+
* { filePath: 'src/simple.ts', complexity: 3, coverage: 80 },
|
|
143
|
+
* ],
|
|
144
|
+
* { framework: 'jest' }
|
|
145
|
+
* );
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
export declare function generateTestsWithPriority(files: Array<FileGenerationInput & {
|
|
149
|
+
complexity?: number;
|
|
150
|
+
coverage?: number;
|
|
151
|
+
changeFrequency?: number;
|
|
152
|
+
}>, config: BatchGenerateConfig): Promise<BatchResult<FileGenerationResult>>;
|
|
153
|
+
//# sourceMappingURL=batchGenerate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchGenerate.d.ts","sourceRoot":"","sources":["../../../src/agents/examples/batchGenerate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAEvC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvE;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,MAAM,EAAE,oBAAoB,CAAC;IAE7B;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,mBAAmB,EAAE,EAC5B,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAkD5C;AAyBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,mBAAmB,GAAG;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GACA,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAO5C;AAeD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,KAAK,CACV,mBAAmB,GAAG;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CACF,EACD,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAS5C"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Batch Test Generation Example
|
|
4
|
+
*
|
|
5
|
+
* Demonstrates using the BatchOperationManager to generate tests
|
|
6
|
+
* for multiple files in parallel with automatic retry and timeout handling.
|
|
7
|
+
*
|
|
8
|
+
* Performance Improvement:
|
|
9
|
+
* - Sequential: 3 files × 2s = 6s
|
|
10
|
+
* - Batched: max(2s) with 5 concurrent = ~2s
|
|
11
|
+
* - Speedup: 3x faster
|
|
12
|
+
*
|
|
13
|
+
* @module agents/examples/batchGenerate
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.generateTestsForFiles = generateTestsForFiles;
|
|
17
|
+
exports.generateTestsForDirectory = generateTestsForDirectory;
|
|
18
|
+
exports.generateTestsWithPriority = generateTestsWithPriority;
|
|
19
|
+
const batch_operations_1 = require("../../utils/batch-operations");
|
|
20
|
+
/**
|
|
21
|
+
* Batch test generation for multiple files
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const files = [
|
|
26
|
+
* { filePath: 'src/utils/parser.ts' },
|
|
27
|
+
* { filePath: 'src/utils/validator.ts' },
|
|
28
|
+
* { filePath: 'src/utils/formatter.ts' }
|
|
29
|
+
* ];
|
|
30
|
+
*
|
|
31
|
+
* const result = await generateTestsForFiles(files, {
|
|
32
|
+
* framework: 'jest',
|
|
33
|
+
* targetCoverage: 80,
|
|
34
|
+
* maxConcurrent: 5,
|
|
35
|
+
* onProgress: (completed, total, file) => {
|
|
36
|
+
* console.log(`Progress: ${completed}/${total} - ${file}`);
|
|
37
|
+
* }
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* console.log(`Generated ${result.results.length} test files`);
|
|
41
|
+
* console.log(`Success rate: ${result.successRate * 100}%`);
|
|
42
|
+
* console.log(`Total time: ${result.totalTime}ms`);
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
async function generateTestsForFiles(files, config) {
|
|
46
|
+
const batchManager = new batch_operations_1.BatchOperationManager();
|
|
47
|
+
const { framework, targetCoverage = 80, maxConcurrent = 5, timeout = 60000, retryOnError = true, onProgress, } = config;
|
|
48
|
+
// Handler function for single file generation
|
|
49
|
+
const generateForFile = async (input) => {
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
// This would call your actual test generation service
|
|
52
|
+
// For now, this is a placeholder that shows the integration pattern
|
|
53
|
+
const result = await generateUnitTestsForFile({
|
|
54
|
+
filePath: input.filePath,
|
|
55
|
+
content: input.content,
|
|
56
|
+
framework,
|
|
57
|
+
targetCoverage,
|
|
58
|
+
...input.config,
|
|
59
|
+
});
|
|
60
|
+
const generationTime = Date.now() - startTime;
|
|
61
|
+
return {
|
|
62
|
+
filePath: input.filePath,
|
|
63
|
+
testFilePath: getTestFilePath(input.filePath, framework),
|
|
64
|
+
result,
|
|
65
|
+
generationTime,
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
// Execute batch generation
|
|
69
|
+
return batchManager.batchExecute(files, generateForFile, {
|
|
70
|
+
maxConcurrent,
|
|
71
|
+
timeout,
|
|
72
|
+
retryOnError,
|
|
73
|
+
maxRetries: 3,
|
|
74
|
+
failFast: false,
|
|
75
|
+
onProgress: (completed, total) => {
|
|
76
|
+
const currentFile = files[completed - 1]?.filePath || 'unknown';
|
|
77
|
+
onProgress?.(completed, total, currentFile);
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Placeholder for actual test generation implementation
|
|
83
|
+
* Replace this with your actual TestGeneratorAgent call
|
|
84
|
+
*/
|
|
85
|
+
async function generateUnitTestsForFile(params) {
|
|
86
|
+
// This would integrate with your TestGeneratorAgent
|
|
87
|
+
// For demonstration purposes only
|
|
88
|
+
throw new Error('Not implemented - integrate with TestGeneratorAgent');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get test file path based on source file path
|
|
92
|
+
*/
|
|
93
|
+
function getTestFilePath(sourcePath, framework) {
|
|
94
|
+
const extension = framework === 'jest' || framework === 'vitest' ? '.test.ts' : '.spec.ts';
|
|
95
|
+
return sourcePath.replace(/\.(ts|js)$/, extension);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Batch generate tests for an entire directory
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* const result = await generateTestsForDirectory('src/utils', {
|
|
103
|
+
* framework: 'jest',
|
|
104
|
+
* pattern: '**\/*.ts',
|
|
105
|
+
* exclude: ['**\/*.test.ts', '**\/*.spec.ts'],
|
|
106
|
+
* maxConcurrent: 5
|
|
107
|
+
* });
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
async function generateTestsForDirectory(directory, config) {
|
|
111
|
+
const { pattern = '**/*.ts', exclude = ['**/*.test.ts', '**/*.spec.ts'] } = config;
|
|
112
|
+
// Find all matching files (would use glob or similar)
|
|
113
|
+
const files = await findSourceFiles(directory, pattern, exclude);
|
|
114
|
+
return generateTestsForFiles(files, config);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Placeholder for file discovery
|
|
118
|
+
* Replace with actual glob implementation
|
|
119
|
+
*/
|
|
120
|
+
async function findSourceFiles(directory, pattern, exclude) {
|
|
121
|
+
// This would use glob or a similar file discovery mechanism
|
|
122
|
+
throw new Error('Not implemented - integrate with file system utilities');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Batch generate tests with intelligent prioritization
|
|
126
|
+
*
|
|
127
|
+
* Prioritizes files by:
|
|
128
|
+
* 1. Code complexity (higher first)
|
|
129
|
+
* 2. Current test coverage (lower first)
|
|
130
|
+
* 3. Change frequency (higher first)
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```typescript
|
|
134
|
+
* const result = await generateTestsWithPriority(
|
|
135
|
+
* [
|
|
136
|
+
* { filePath: 'src/complex.ts', complexity: 15, coverage: 20 },
|
|
137
|
+
* { filePath: 'src/simple.ts', complexity: 3, coverage: 80 },
|
|
138
|
+
* ],
|
|
139
|
+
* { framework: 'jest' }
|
|
140
|
+
* );
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
async function generateTestsWithPriority(files, config) {
|
|
144
|
+
// Sort by priority score
|
|
145
|
+
const prioritized = [...files].sort((a, b) => {
|
|
146
|
+
const scoreA = calculatePriorityScore(a);
|
|
147
|
+
const scoreB = calculatePriorityScore(b);
|
|
148
|
+
return scoreB - scoreA; // Higher score first
|
|
149
|
+
});
|
|
150
|
+
return generateTestsForFiles(prioritized, config);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Calculate priority score for a file
|
|
154
|
+
* Higher score = higher priority
|
|
155
|
+
*/
|
|
156
|
+
function calculatePriorityScore(file) {
|
|
157
|
+
const complexity = file.complexity || 5;
|
|
158
|
+
const coverage = file.coverage || 50;
|
|
159
|
+
const changeFrequency = file.changeFrequency || 1;
|
|
160
|
+
// Normalize to 0-100 scale and weight
|
|
161
|
+
const complexityScore = Math.min(complexity * 5, 100) * 0.4;
|
|
162
|
+
const coverageScore = (100 - coverage) * 0.4; // Invert: lower coverage = higher priority
|
|
163
|
+
const changeScore = Math.min(changeFrequency * 10, 100) * 0.2;
|
|
164
|
+
return complexityScore + coverageScore + changeScore;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=batchGenerate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchGenerate.js","sourceRoot":"","sources":["../../../src/agents/examples/batchGenerate.ts"],"names":[],"mappings":"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"}
|