agentic-qe 1.0.5 → 1.1.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/agents/qe-quality-analyzer.md +405 -0
- package/CHANGELOG.md +109 -0
- package/CONTRIBUTING.md +51 -0
- package/README.md +669 -162
- package/bin/aqe +90 -938
- package/dist/adapters/MemoryStoreAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryStoreAdapter.js +6 -0
- package/dist/adapters/MemoryStoreAdapter.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.d.ts +58 -3
- package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +316 -48
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/FlakyTestHunterAgent.d.ts +48 -4
- package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -1
- package/dist/agents/FlakyTestHunterAgent.js +217 -10
- package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
- package/dist/agents/LearningAgent.d.ts +75 -0
- package/dist/agents/LearningAgent.d.ts.map +1 -0
- package/dist/agents/LearningAgent.js +177 -0
- package/dist/agents/LearningAgent.js.map +1 -0
- package/dist/agents/TestGeneratorAgent.d.ts +42 -2
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +232 -13
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/cli/commands/improve/index.d.ts +70 -0
- package/dist/cli/commands/improve/index.d.ts.map +1 -0
- package/dist/cli/commands/improve/index.js +530 -0
- package/dist/cli/commands/improve/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +33 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +656 -39
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learn/index.d.ts +68 -0
- package/dist/cli/commands/learn/index.d.ts.map +1 -0
- package/dist/cli/commands/learn/index.js +431 -0
- package/dist/cli/commands/learn/index.js.map +1 -0
- package/dist/cli/commands/patterns/index.d.ts +75 -0
- package/dist/cli/commands/patterns/index.d.ts.map +1 -0
- package/dist/cli/commands/patterns/index.js +502 -0
- package/dist/cli/commands/patterns/index.js.map +1 -0
- package/dist/cli/index.js +367 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts +5 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +7 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/learning/FlakyFixRecommendations.d.ts +40 -0
- package/dist/learning/FlakyFixRecommendations.d.ts.map +1 -0
- package/dist/learning/FlakyFixRecommendations.js +247 -0
- package/dist/learning/FlakyFixRecommendations.js.map +1 -0
- package/dist/learning/FlakyPredictionModel.d.ts +57 -0
- package/dist/learning/FlakyPredictionModel.d.ts.map +1 -0
- package/dist/learning/FlakyPredictionModel.js +289 -0
- package/dist/learning/FlakyPredictionModel.js.map +1 -0
- package/dist/learning/FlakyTestDetector.d.ts +46 -0
- package/dist/learning/FlakyTestDetector.d.ts.map +1 -0
- package/dist/learning/FlakyTestDetector.js +215 -0
- package/dist/learning/FlakyTestDetector.js.map +1 -0
- package/dist/learning/ImprovementLoop.d.ts +119 -0
- package/dist/learning/ImprovementLoop.d.ts.map +1 -0
- package/dist/learning/ImprovementLoop.js +353 -0
- package/dist/learning/ImprovementLoop.js.map +1 -0
- package/dist/learning/LearningEngine.d.ts +144 -0
- package/dist/learning/LearningEngine.d.ts.map +1 -0
- package/dist/learning/LearningEngine.js +531 -0
- package/dist/learning/LearningEngine.js.map +1 -0
- package/dist/learning/PerformanceTracker.d.ts +118 -0
- package/dist/learning/PerformanceTracker.d.ts.map +1 -0
- package/dist/learning/PerformanceTracker.js +376 -0
- package/dist/learning/PerformanceTracker.js.map +1 -0
- package/dist/learning/StatisticalAnalysis.d.ts +47 -0
- package/dist/learning/StatisticalAnalysis.d.ts.map +1 -0
- package/dist/learning/StatisticalAnalysis.js +170 -0
- package/dist/learning/StatisticalAnalysis.js.map +1 -0
- package/dist/learning/SwarmIntegration.d.ts +107 -0
- package/dist/learning/SwarmIntegration.d.ts.map +1 -0
- package/dist/learning/SwarmIntegration.js +191 -0
- package/dist/learning/SwarmIntegration.js.map +1 -0
- package/dist/learning/index.d.ts +10 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +16 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/types.d.ts +288 -0
- package/dist/learning/types.d.ts.map +1 -0
- package/dist/learning/types.js +9 -0
- package/dist/learning/types.js.map +1 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.d.ts +175 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.d.ts.map +1 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.js +693 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +94 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +15 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +17 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/reasoning/CodeSignatureGenerator.d.ts +98 -0
- package/dist/reasoning/CodeSignatureGenerator.d.ts.map +1 -0
- package/dist/reasoning/CodeSignatureGenerator.js +427 -0
- package/dist/reasoning/CodeSignatureGenerator.js.map +1 -0
- package/dist/reasoning/PatternClassifier.d.ts +98 -0
- package/dist/reasoning/PatternClassifier.d.ts.map +1 -0
- package/dist/reasoning/PatternClassifier.js +345 -0
- package/dist/reasoning/PatternClassifier.js.map +1 -0
- package/dist/reasoning/PatternExtractor.d.ts +131 -0
- package/dist/reasoning/PatternExtractor.d.ts.map +1 -0
- package/dist/reasoning/PatternExtractor.js +539 -0
- package/dist/reasoning/PatternExtractor.js.map +1 -0
- package/dist/reasoning/PatternMemoryIntegration.d.ts +102 -0
- package/dist/reasoning/PatternMemoryIntegration.d.ts.map +1 -0
- package/dist/reasoning/PatternMemoryIntegration.js +336 -0
- package/dist/reasoning/PatternMemoryIntegration.js.map +1 -0
- package/dist/reasoning/QEReasoningBank.d.ts +121 -0
- package/dist/reasoning/QEReasoningBank.d.ts.map +1 -0
- package/dist/reasoning/QEReasoningBank.js +235 -0
- package/dist/reasoning/QEReasoningBank.js.map +1 -0
- package/dist/reasoning/TestTemplateCreator.d.ts +95 -0
- package/dist/reasoning/TestTemplateCreator.d.ts.map +1 -0
- package/dist/reasoning/TestTemplateCreator.js +535 -0
- package/dist/reasoning/TestTemplateCreator.js.map +1 -0
- package/dist/reasoning/index.d.ts +10 -0
- package/dist/reasoning/index.d.ts.map +1 -0
- package/dist/reasoning/index.js +31 -0
- package/dist/reasoning/index.js.map +1 -0
- package/dist/reasoning/types.d.ts +717 -0
- package/dist/reasoning/types.d.ts.map +1 -0
- package/dist/reasoning/types.js +57 -0
- package/dist/reasoning/types.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/pattern.types.d.ts +364 -0
- package/dist/types/pattern.types.d.ts.map +1 -0
- package/dist/types/pattern.types.js +60 -0
- package/dist/types/pattern.types.js.map +1 -0
- package/package.json +25 -3
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PatternExtractor - AST-based pattern extraction from test suites
|
|
4
|
+
* Phase 2 (v1.1.0) - Pattern Extraction Specialist
|
|
5
|
+
*
|
|
6
|
+
* Extracts reusable patterns from existing test suites including:
|
|
7
|
+
* - Edge cases and boundary conditions
|
|
8
|
+
* - Error handling patterns
|
|
9
|
+
* - Mock and assertion patterns
|
|
10
|
+
* - Integration patterns
|
|
11
|
+
*
|
|
12
|
+
* Performance: Process 100+ test files in < 5 seconds
|
|
13
|
+
* Accuracy: > 85% pattern extraction accuracy
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.PatternExtractor = void 0;
|
|
50
|
+
const parser_1 = require("@babel/parser");
|
|
51
|
+
const fs = __importStar(require("fs-extra"));
|
|
52
|
+
const crypto = __importStar(require("crypto"));
|
|
53
|
+
const pattern_types_1 = require("../types/pattern.types");
|
|
54
|
+
const Logger_1 = require("../utils/Logger");
|
|
55
|
+
/**
|
|
56
|
+
* Main pattern extractor class
|
|
57
|
+
*/
|
|
58
|
+
class PatternExtractor {
|
|
59
|
+
constructor(config) {
|
|
60
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
61
|
+
this.extractedPatterns = new Map();
|
|
62
|
+
this.patternFrequency = new Map();
|
|
63
|
+
this.config = {
|
|
64
|
+
frameworks: [pattern_types_1.TestFramework.JEST, pattern_types_1.TestFramework.MOCHA, pattern_types_1.TestFramework.CYPRESS],
|
|
65
|
+
minConfidence: 0.7,
|
|
66
|
+
minFrequency: 2,
|
|
67
|
+
maxPatternsPerFile: 10,
|
|
68
|
+
parallel: true,
|
|
69
|
+
astOptions: {
|
|
70
|
+
typescript: true,
|
|
71
|
+
jsx: true,
|
|
72
|
+
includeComments: true,
|
|
73
|
+
maxDepth: 50
|
|
74
|
+
},
|
|
75
|
+
...config
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Extract patterns from multiple test files
|
|
80
|
+
*/
|
|
81
|
+
async extractFromFiles(filePaths) {
|
|
82
|
+
const startTime = Date.now();
|
|
83
|
+
const errors = [];
|
|
84
|
+
let totalTests = 0;
|
|
85
|
+
const patterns = [];
|
|
86
|
+
this.logger.info(`Extracting patterns from ${filePaths.length} files`);
|
|
87
|
+
for (const filePath of filePaths) {
|
|
88
|
+
try {
|
|
89
|
+
const filePatterns = await this.extractFromFile(filePath);
|
|
90
|
+
patterns.push(...filePatterns);
|
|
91
|
+
totalTests += this.countTestsInFile(filePath);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
errors.push({
|
|
95
|
+
file: filePath,
|
|
96
|
+
message: error.message,
|
|
97
|
+
type: 'analysis-error',
|
|
98
|
+
stack: error.stack
|
|
99
|
+
});
|
|
100
|
+
this.logger.error(`Failed to extract patterns from ${filePath}:`, error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const processingTime = Date.now() - startTime;
|
|
104
|
+
const statistics = this.calculateStatistics(filePaths.length, totalTests, patterns, processingTime);
|
|
105
|
+
return {
|
|
106
|
+
patterns: this.deduplicatePatterns(patterns),
|
|
107
|
+
signatures: [],
|
|
108
|
+
statistics,
|
|
109
|
+
errors,
|
|
110
|
+
timestamp: new Date()
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Extract patterns from a single test file
|
|
115
|
+
*/
|
|
116
|
+
async extractFromFile(filePath) {
|
|
117
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
118
|
+
const framework = this.detectFramework(content);
|
|
119
|
+
const ast = this.parseCode(content, filePath);
|
|
120
|
+
const patterns = [];
|
|
121
|
+
// Extract different pattern types
|
|
122
|
+
patterns.push(...this.extractEdgeCasePatterns(ast, framework, filePath));
|
|
123
|
+
patterns.push(...this.extractBoundaryConditionPatterns(ast, framework, filePath));
|
|
124
|
+
patterns.push(...this.extractErrorHandlingPatterns(ast, framework, filePath));
|
|
125
|
+
patterns.push(...this.extractMockPatterns(ast, framework, filePath));
|
|
126
|
+
patterns.push(...this.extractAssertionPatterns(ast, framework, filePath));
|
|
127
|
+
patterns.push(...this.extractAsyncPatterns(ast, framework, filePath));
|
|
128
|
+
// Filter by confidence and frequency
|
|
129
|
+
return patterns
|
|
130
|
+
.filter(p => p.confidence >= this.config.minConfidence)
|
|
131
|
+
.slice(0, this.config.maxPatternsPerFile);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Parse source code to AST
|
|
135
|
+
*/
|
|
136
|
+
parseCode(code, filePath) {
|
|
137
|
+
try {
|
|
138
|
+
return (0, parser_1.parse)(code, {
|
|
139
|
+
sourceType: 'module',
|
|
140
|
+
plugins: [
|
|
141
|
+
'typescript',
|
|
142
|
+
'jsx',
|
|
143
|
+
'decorators-legacy',
|
|
144
|
+
'classProperties',
|
|
145
|
+
'asyncGenerators',
|
|
146
|
+
'dynamicImport',
|
|
147
|
+
'optionalChaining',
|
|
148
|
+
'nullishCoalescingOperator'
|
|
149
|
+
],
|
|
150
|
+
sourceFilename: filePath
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw new Error(`Failed to parse ${filePath}: ${error.message}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Detect test framework from source code
|
|
159
|
+
* Checks framework-specific indicators in priority order
|
|
160
|
+
*/
|
|
161
|
+
detectFramework(code) {
|
|
162
|
+
// Check framework-specific indicators first (highest priority)
|
|
163
|
+
if (code.includes('cy.') || code.includes('Cypress')) {
|
|
164
|
+
return pattern_types_1.TestFramework.CYPRESS;
|
|
165
|
+
}
|
|
166
|
+
if (code.includes('vitest') || code.includes('vi.') || code.includes('import { test, expect } from \'vitest\'')) {
|
|
167
|
+
return pattern_types_1.TestFramework.VITEST;
|
|
168
|
+
}
|
|
169
|
+
if (code.includes('t.is(') || code.includes('test.serial') || code.includes('import test from \'ava\'')) {
|
|
170
|
+
return pattern_types_1.TestFramework.AVA;
|
|
171
|
+
}
|
|
172
|
+
if (code.includes('jasmine') || code.includes('spyOn(') || code.includes('jasmine.')) {
|
|
173
|
+
return pattern_types_1.TestFramework.JASMINE;
|
|
174
|
+
}
|
|
175
|
+
if (code.includes('mocha') || code.includes('chai') || code.includes('assert.') || code.includes('should.')) {
|
|
176
|
+
return pattern_types_1.TestFramework.MOCHA;
|
|
177
|
+
}
|
|
178
|
+
if (code.includes('@jest') || code.includes('jest.') || code.includes('test.skip') || code.includes('test.only')) {
|
|
179
|
+
return pattern_types_1.TestFramework.JEST;
|
|
180
|
+
}
|
|
181
|
+
// Fallback to generic detection (describe/it/test are used by multiple frameworks)
|
|
182
|
+
if (code.includes('describe(') || code.includes('it(') || code.includes('test(')) {
|
|
183
|
+
return pattern_types_1.TestFramework.JEST; // Default only after all specific checks
|
|
184
|
+
}
|
|
185
|
+
return pattern_types_1.TestFramework.JEST;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Extract edge case patterns
|
|
189
|
+
*/
|
|
190
|
+
extractEdgeCasePatterns(ast, framework, filePath) {
|
|
191
|
+
const patterns = [];
|
|
192
|
+
const edgeCaseIndicators = [
|
|
193
|
+
'null', 'undefined', 'empty', 'zero', 'negative', 'max', 'min',
|
|
194
|
+
'edge', 'boundary', 'limit', 'extreme'
|
|
195
|
+
];
|
|
196
|
+
this.traverseAST(ast, (node) => {
|
|
197
|
+
if (this.isTestBlock(node)) {
|
|
198
|
+
const testName = this.getTestName(node);
|
|
199
|
+
const hasEdgeCaseIndicator = edgeCaseIndicators.some(indicator => testName.toLowerCase().includes(indicator));
|
|
200
|
+
if (hasEdgeCaseIndicator) {
|
|
201
|
+
const pattern = this.createPattern(node, pattern_types_1.PatternType.EDGE_CASE, framework, filePath, testName, 0.85);
|
|
202
|
+
patterns.push(pattern);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
return patterns;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Extract boundary condition patterns
|
|
210
|
+
*/
|
|
211
|
+
extractBoundaryConditionPatterns(ast, framework, filePath) {
|
|
212
|
+
const patterns = [];
|
|
213
|
+
const boundaryIndicators = [
|
|
214
|
+
'boundary', 'range', 'between', 'threshold', 'limit',
|
|
215
|
+
'>=', '<=', '>', '<', 'minimum', 'maximum'
|
|
216
|
+
];
|
|
217
|
+
this.traverseAST(ast, (node) => {
|
|
218
|
+
if (this.isTestBlock(node)) {
|
|
219
|
+
const code = this.getNodeCode(node);
|
|
220
|
+
const hasBoundaryCheck = boundaryIndicators.some(indicator => code.includes(indicator));
|
|
221
|
+
if (hasBoundaryCheck) {
|
|
222
|
+
const testName = this.getTestName(node);
|
|
223
|
+
const pattern = this.createPattern(node, pattern_types_1.PatternType.BOUNDARY_CONDITION, framework, filePath, testName, 0.8);
|
|
224
|
+
patterns.push(pattern);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
return patterns;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Extract error handling patterns
|
|
232
|
+
*/
|
|
233
|
+
extractErrorHandlingPatterns(ast, framework, filePath) {
|
|
234
|
+
const patterns = [];
|
|
235
|
+
this.traverseAST(ast, (node) => {
|
|
236
|
+
if (this.isTestBlock(node)) {
|
|
237
|
+
const code = this.getNodeCode(node);
|
|
238
|
+
const hasErrorHandling = (code.includes('try') && code.includes('catch')) ||
|
|
239
|
+
code.includes('toThrow') ||
|
|
240
|
+
code.includes('rejects') ||
|
|
241
|
+
code.includes('.catch(') ||
|
|
242
|
+
(code.includes('expect') && code.includes('Error'));
|
|
243
|
+
if (hasErrorHandling) {
|
|
244
|
+
const testName = this.getTestName(node);
|
|
245
|
+
const pattern = this.createPattern(node, pattern_types_1.PatternType.ERROR_HANDLING, framework, filePath, testName, 0.9);
|
|
246
|
+
patterns.push(pattern);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
return patterns;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Extract mock patterns
|
|
254
|
+
*/
|
|
255
|
+
extractMockPatterns(ast, framework, filePath) {
|
|
256
|
+
const patterns = [];
|
|
257
|
+
const mockIndicators = ['mock', 'stub', 'spy', 'jest.fn', 'sinon', 'jest.spyOn'];
|
|
258
|
+
this.traverseAST(ast, (node) => {
|
|
259
|
+
if (this.isTestBlock(node)) {
|
|
260
|
+
const code = this.getNodeCode(node);
|
|
261
|
+
const hasMocking = mockIndicators.some(indicator => code.includes(indicator));
|
|
262
|
+
if (hasMocking) {
|
|
263
|
+
const testName = this.getTestName(node);
|
|
264
|
+
const pattern = this.createPattern(node, pattern_types_1.PatternType.MOCK_PATTERN, framework, filePath, testName, 0.85);
|
|
265
|
+
patterns.push(pattern);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
return patterns;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Extract assertion patterns
|
|
273
|
+
*/
|
|
274
|
+
extractAssertionPatterns(ast, framework, filePath) {
|
|
275
|
+
const patterns = [];
|
|
276
|
+
this.traverseAST(ast, (node) => {
|
|
277
|
+
if (this.isTestBlock(node)) {
|
|
278
|
+
const assertionCount = this.countAssertions(node);
|
|
279
|
+
if (assertionCount >= 3) {
|
|
280
|
+
const testName = this.getTestName(node);
|
|
281
|
+
const pattern = this.createPattern(node, pattern_types_1.PatternType.ASSERTION_PATTERN, framework, filePath, testName, 0.75);
|
|
282
|
+
patterns.push(pattern);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
return patterns;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Extract async patterns
|
|
290
|
+
*/
|
|
291
|
+
extractAsyncPatterns(ast, framework, filePath) {
|
|
292
|
+
const patterns = [];
|
|
293
|
+
this.traverseAST(ast, (node) => {
|
|
294
|
+
if (this.isTestBlock(node)) {
|
|
295
|
+
const code = this.getNodeCode(node);
|
|
296
|
+
const isAsync = code.includes('async') ||
|
|
297
|
+
code.includes('await') ||
|
|
298
|
+
code.includes('Promise') ||
|
|
299
|
+
code.includes('.then(');
|
|
300
|
+
if (isAsync) {
|
|
301
|
+
const testName = this.getTestName(node);
|
|
302
|
+
const pattern = this.createPattern(node, pattern_types_1.PatternType.ASYNC_PATTERN, framework, filePath, testName, 0.8);
|
|
303
|
+
patterns.push(pattern);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
return patterns;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Create a test pattern from AST node
|
|
311
|
+
*/
|
|
312
|
+
createPattern(node, type, framework, filePath, name, confidence) {
|
|
313
|
+
const id = this.generatePatternId(name, type);
|
|
314
|
+
const code = this.getNodeCode(node);
|
|
315
|
+
return {
|
|
316
|
+
id,
|
|
317
|
+
name,
|
|
318
|
+
type,
|
|
319
|
+
category: this.inferCategory(type),
|
|
320
|
+
framework,
|
|
321
|
+
template: this.createEmptyTemplate(id, name),
|
|
322
|
+
examples: [code],
|
|
323
|
+
frequency: 1,
|
|
324
|
+
confidence,
|
|
325
|
+
applicabilityConditions: this.inferApplicabilityConditions(type),
|
|
326
|
+
sourceFile: filePath,
|
|
327
|
+
createdAt: new Date(),
|
|
328
|
+
metadata: {
|
|
329
|
+
nodeType: node.type,
|
|
330
|
+
location: this.getLocation(node)
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Traverse AST and apply visitor function
|
|
336
|
+
*/
|
|
337
|
+
traverseAST(ast, visitor) {
|
|
338
|
+
const traverse = (node, depth = 0) => {
|
|
339
|
+
if (!node || depth > (this.config.astOptions.maxDepth || 50))
|
|
340
|
+
return;
|
|
341
|
+
visitor(node);
|
|
342
|
+
for (const key in node) {
|
|
343
|
+
if (node[key] && typeof node[key] === 'object') {
|
|
344
|
+
if (Array.isArray(node[key])) {
|
|
345
|
+
node[key].forEach((child) => traverse(child, depth + 1));
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
traverse(node[key], depth + 1);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
traverse(ast);
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Check if node is a test block
|
|
357
|
+
*/
|
|
358
|
+
isTestBlock(node) {
|
|
359
|
+
if (node.type !== 'CallExpression')
|
|
360
|
+
return false;
|
|
361
|
+
const callee = node.callee;
|
|
362
|
+
if (!callee)
|
|
363
|
+
return false;
|
|
364
|
+
const testFunctions = ['it', 'test', 'describe', 'context', 'specify'];
|
|
365
|
+
return testFunctions.includes(callee.name || callee.property?.name);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Get test name from node
|
|
369
|
+
*/
|
|
370
|
+
getTestName(node) {
|
|
371
|
+
if (node.arguments && node.arguments.length > 0) {
|
|
372
|
+
const firstArg = node.arguments[0];
|
|
373
|
+
if (firstArg.type === 'StringLiteral') {
|
|
374
|
+
return firstArg.value;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return 'unnamed-test';
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Get code from node
|
|
381
|
+
*/
|
|
382
|
+
getNodeCode(node) {
|
|
383
|
+
// Simplified - in real implementation, use recast or similar
|
|
384
|
+
return JSON.stringify(node, null, 2);
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Count assertions in test block
|
|
388
|
+
*/
|
|
389
|
+
countAssertions(node) {
|
|
390
|
+
let count = 0;
|
|
391
|
+
this.traverseAST(node, (n) => {
|
|
392
|
+
if (n.type === 'CallExpression') {
|
|
393
|
+
const callee = n.callee;
|
|
394
|
+
if (callee?.name === 'expect' || callee?.property?.name === 'expect') {
|
|
395
|
+
count++;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
return count;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get node location
|
|
403
|
+
*/
|
|
404
|
+
getLocation(node) {
|
|
405
|
+
return {
|
|
406
|
+
startLine: node.loc?.start?.line || 0,
|
|
407
|
+
endLine: node.loc?.end?.line || 0,
|
|
408
|
+
startColumn: node.loc?.start?.column || 0,
|
|
409
|
+
endColumn: node.loc?.end?.column || 0
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Generate pattern ID
|
|
414
|
+
*/
|
|
415
|
+
generatePatternId(name, type) {
|
|
416
|
+
const hash = crypto
|
|
417
|
+
.createHash('md5')
|
|
418
|
+
.update(`${name}-${type}-${Date.now()}`)
|
|
419
|
+
.digest('hex')
|
|
420
|
+
.substring(0, 8);
|
|
421
|
+
return `pattern-${type}-${hash}`;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Infer pattern category from type
|
|
425
|
+
*/
|
|
426
|
+
inferCategory(type) {
|
|
427
|
+
const categoryMap = {
|
|
428
|
+
[pattern_types_1.PatternType.EDGE_CASE]: pattern_types_1.PatternCategory.UNIT_TEST,
|
|
429
|
+
[pattern_types_1.PatternType.BOUNDARY_CONDITION]: pattern_types_1.PatternCategory.UNIT_TEST,
|
|
430
|
+
[pattern_types_1.PatternType.ERROR_HANDLING]: pattern_types_1.PatternCategory.UNIT_TEST,
|
|
431
|
+
[pattern_types_1.PatternType.INTEGRATION]: pattern_types_1.PatternCategory.INTEGRATION_TEST,
|
|
432
|
+
[pattern_types_1.PatternType.ASYNC_PATTERN]: pattern_types_1.PatternCategory.INTEGRATION_TEST,
|
|
433
|
+
[pattern_types_1.PatternType.MOCK_PATTERN]: pattern_types_1.PatternCategory.UNIT_TEST,
|
|
434
|
+
[pattern_types_1.PatternType.ASSERTION_PATTERN]: pattern_types_1.PatternCategory.UNIT_TEST,
|
|
435
|
+
[pattern_types_1.PatternType.SETUP_TEARDOWN]: pattern_types_1.PatternCategory.UNIT_TEST,
|
|
436
|
+
[pattern_types_1.PatternType.DATA_DRIVEN]: pattern_types_1.PatternCategory.UNIT_TEST,
|
|
437
|
+
[pattern_types_1.PatternType.PARAMETERIZED]: pattern_types_1.PatternCategory.UNIT_TEST
|
|
438
|
+
};
|
|
439
|
+
return categoryMap[type] || pattern_types_1.PatternCategory.UNIT_TEST;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Infer applicability conditions
|
|
443
|
+
*/
|
|
444
|
+
inferApplicabilityConditions(type) {
|
|
445
|
+
const conditionsMap = {
|
|
446
|
+
[pattern_types_1.PatternType.EDGE_CASE]: ['function with input validation', 'nullable parameters'],
|
|
447
|
+
[pattern_types_1.PatternType.BOUNDARY_CONDITION]: ['range-based logic', 'numeric comparisons'],
|
|
448
|
+
[pattern_types_1.PatternType.ERROR_HANDLING]: ['functions that throw errors', 'async operations'],
|
|
449
|
+
[pattern_types_1.PatternType.INTEGRATION]: ['multiple module interactions', 'external dependencies'],
|
|
450
|
+
[pattern_types_1.PatternType.ASYNC_PATTERN]: ['asynchronous operations', 'promises'],
|
|
451
|
+
[pattern_types_1.PatternType.MOCK_PATTERN]: ['external dependencies', 'database calls', 'API calls'],
|
|
452
|
+
[pattern_types_1.PatternType.ASSERTION_PATTERN]: ['complex return values', 'multiple properties'],
|
|
453
|
+
[pattern_types_1.PatternType.SETUP_TEARDOWN]: ['stateful tests', 'resource initialization'],
|
|
454
|
+
[pattern_types_1.PatternType.DATA_DRIVEN]: ['multiple test cases with similar structure'],
|
|
455
|
+
[pattern_types_1.PatternType.PARAMETERIZED]: ['similar tests with different inputs']
|
|
456
|
+
};
|
|
457
|
+
return conditionsMap[type] || [];
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Create empty template (to be filled by TestTemplateCreator)
|
|
461
|
+
*/
|
|
462
|
+
createEmptyTemplate(id, name) {
|
|
463
|
+
return {
|
|
464
|
+
id: `template-${id}`,
|
|
465
|
+
name: `Template: ${name}`,
|
|
466
|
+
description: 'Auto-generated template',
|
|
467
|
+
structure: { type: 'root', id: 'root', children: [], properties: {}, parameterRefs: [] },
|
|
468
|
+
parameters: [],
|
|
469
|
+
validationRules: [],
|
|
470
|
+
codeGenerators: {}
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Count tests in file
|
|
475
|
+
*/
|
|
476
|
+
countTestsInFile(filePath) {
|
|
477
|
+
// Simplified - count test blocks
|
|
478
|
+
return 1;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Calculate extraction statistics
|
|
482
|
+
*/
|
|
483
|
+
calculateStatistics(filesProcessed, testsAnalyzed, patterns, processingTime) {
|
|
484
|
+
const patternTypeDistribution = {};
|
|
485
|
+
patterns.forEach(p => {
|
|
486
|
+
patternTypeDistribution[p.type] = (patternTypeDistribution[p.type] || 0) + 1;
|
|
487
|
+
});
|
|
488
|
+
return {
|
|
489
|
+
filesProcessed,
|
|
490
|
+
testsAnalyzed,
|
|
491
|
+
patternsExtracted: patterns.length,
|
|
492
|
+
processingTime,
|
|
493
|
+
avgPatternsPerFile: patterns.length / Math.max(filesProcessed, 1),
|
|
494
|
+
patternTypeDistribution
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Deduplicate patterns by normalizing names and merging similar patterns
|
|
499
|
+
*/
|
|
500
|
+
deduplicatePatterns(patterns) {
|
|
501
|
+
const seen = new Map();
|
|
502
|
+
patterns.forEach(p => {
|
|
503
|
+
// Normalize pattern name to detect similarity
|
|
504
|
+
const normalizedName = this.normalizePatternName(p.name);
|
|
505
|
+
const key = `${p.type}-${normalizedName}`;
|
|
506
|
+
if (!seen.has(key)) {
|
|
507
|
+
seen.set(key, p);
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
// Merge examples and update frequency
|
|
511
|
+
const existing = seen.get(key);
|
|
512
|
+
existing.examples.push(...p.examples);
|
|
513
|
+
existing.frequency++;
|
|
514
|
+
// Increase confidence slightly based on frequency
|
|
515
|
+
existing.confidence = Math.min(existing.confidence + 0.02, 1.0);
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
return Array.from(seen.values());
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Normalize pattern name for deduplication
|
|
522
|
+
* Removes trailing numbers, extra whitespace, and normalizes case
|
|
523
|
+
*/
|
|
524
|
+
normalizePatternName(name) {
|
|
525
|
+
return name
|
|
526
|
+
.toLowerCase()
|
|
527
|
+
.replace(/\s+\d+$/g, '') // Remove trailing numbers like " 1", " 2"
|
|
528
|
+
.replace(/\s+/g, ' ') // Normalize whitespace
|
|
529
|
+
.trim();
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Get extracted patterns
|
|
533
|
+
*/
|
|
534
|
+
getPatterns() {
|
|
535
|
+
return Array.from(this.extractedPatterns.values());
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
exports.PatternExtractor = PatternExtractor;
|
|
539
|
+
//# sourceMappingURL=PatternExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PatternExtractor.js","sourceRoot":"","sources":["../../src/reasoning/PatternExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatternMemoryIntegration - Integration with ReasoningBank and shared memory
|
|
3
|
+
* Phase 2 (v1.1.0) - Pattern Extraction Specialist
|
|
4
|
+
*
|
|
5
|
+
* Provides storage and retrieval of extracted patterns in shared memory
|
|
6
|
+
* for coordination across agents in the AQE fleet.
|
|
7
|
+
*/
|
|
8
|
+
import { MemoryStore } from '../types';
|
|
9
|
+
import { TestPattern, PatternExtractionResult, CodeSignature, TestTemplate, PatternSimilarity, PatternRecommendation } from '../types/pattern.types';
|
|
10
|
+
export interface PatternMemoryConfig {
|
|
11
|
+
namespace: string;
|
|
12
|
+
ttl: number;
|
|
13
|
+
partition: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Pattern memory integration for ReasoningBank
|
|
17
|
+
*/
|
|
18
|
+
export declare class PatternMemoryIntegration {
|
|
19
|
+
private logger;
|
|
20
|
+
private memoryStore;
|
|
21
|
+
private config;
|
|
22
|
+
constructor(memoryStore: MemoryStore, config?: Partial<PatternMemoryConfig>);
|
|
23
|
+
/**
|
|
24
|
+
* Store extracted patterns
|
|
25
|
+
*/
|
|
26
|
+
storePatterns(result: PatternExtractionResult, key?: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Retrieve extracted patterns
|
|
29
|
+
*/
|
|
30
|
+
retrievePatterns(key?: string): Promise<PatternExtractionResult | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Store code signatures
|
|
33
|
+
*/
|
|
34
|
+
storeSignatures(signatures: CodeSignature[], key?: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Retrieve code signatures
|
|
37
|
+
*/
|
|
38
|
+
retrieveSignatures(key?: string): Promise<CodeSignature[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Store test templates
|
|
41
|
+
*/
|
|
42
|
+
storeTemplates(templates: TestTemplate[], key?: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Retrieve test templates
|
|
45
|
+
*/
|
|
46
|
+
retrieveTemplates(key?: string): Promise<TestTemplate[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Store pattern similarities
|
|
49
|
+
*/
|
|
50
|
+
storeSimilarities(similarities: PatternSimilarity[], key?: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Store pattern recommendations
|
|
53
|
+
*/
|
|
54
|
+
storeRecommendations(recommendations: PatternRecommendation[], sourceCodeHash: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Retrieve pattern recommendations
|
|
57
|
+
*/
|
|
58
|
+
retrieveRecommendations(sourceCodeHash: string): Promise<PatternRecommendation[]>;
|
|
59
|
+
/**
|
|
60
|
+
* Store pattern by ID for quick access
|
|
61
|
+
*/
|
|
62
|
+
storePatternById(pattern: TestPattern): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Retrieve pattern by ID
|
|
65
|
+
*/
|
|
66
|
+
retrievePatternById(patternId: string): Promise<TestPattern | null>;
|
|
67
|
+
/**
|
|
68
|
+
* Update extraction statistics
|
|
69
|
+
*/
|
|
70
|
+
updateStatistics(stats: {
|
|
71
|
+
totalPatternsExtracted: number;
|
|
72
|
+
totalFilesProcessed: number;
|
|
73
|
+
totalProcessingTime: number;
|
|
74
|
+
lastExtraction: Date;
|
|
75
|
+
}): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Get extraction statistics
|
|
78
|
+
*/
|
|
79
|
+
getStatistics(): Promise<any>;
|
|
80
|
+
/**
|
|
81
|
+
* Clear all patterns from memory
|
|
82
|
+
*/
|
|
83
|
+
clearPatterns(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Export patterns for backup/migration
|
|
86
|
+
*/
|
|
87
|
+
exportPatterns(): Promise<{
|
|
88
|
+
patterns: TestPattern[];
|
|
89
|
+
templates: TestTemplate[];
|
|
90
|
+
signatures: CodeSignature[];
|
|
91
|
+
statistics: any;
|
|
92
|
+
}>;
|
|
93
|
+
/**
|
|
94
|
+
* Import patterns from backup
|
|
95
|
+
*/
|
|
96
|
+
importPatterns(data: {
|
|
97
|
+
patterns: TestPattern[];
|
|
98
|
+
templates?: TestTemplate[];
|
|
99
|
+
signatures?: CodeSignature[];
|
|
100
|
+
}): Promise<void>;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=PatternMemoryIntegration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PatternMemoryIntegration.d.ts","sourceRoot":"","sources":["../../src/reasoning/PatternMemoryIntegration.ts"],"names":[],"mappings":"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"}
|