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,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PatternClassifier - Classify and recommend patterns for code
|
|
4
|
+
* Phase 2 (v1.1.0) - Pattern Extraction Specialist
|
|
5
|
+
*
|
|
6
|
+
* Classifies patterns by type and calculates similarity scores to:
|
|
7
|
+
* - Categorize extracted patterns
|
|
8
|
+
* - Calculate pattern similarity
|
|
9
|
+
* - Recommend patterns for new code
|
|
10
|
+
* - Support pattern-based test generation
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.PatternClassifier = void 0;
|
|
14
|
+
const pattern_types_1 = require("../types/pattern.types");
|
|
15
|
+
const Logger_1 = require("../utils/Logger");
|
|
16
|
+
const CodeSignatureGenerator_1 = require("./CodeSignatureGenerator");
|
|
17
|
+
class PatternClassifier {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
20
|
+
this.signatureGenerator = new CodeSignatureGenerator_1.CodeSignatureGenerator();
|
|
21
|
+
this.patterns = new Map();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load patterns for classification
|
|
25
|
+
*/
|
|
26
|
+
loadPatterns(patterns) {
|
|
27
|
+
patterns.forEach(pattern => {
|
|
28
|
+
this.patterns.set(pattern.id, pattern);
|
|
29
|
+
});
|
|
30
|
+
this.logger.info(`Loaded ${patterns.length} patterns for classification`);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Classify a pattern
|
|
34
|
+
*/
|
|
35
|
+
async classify(pattern) {
|
|
36
|
+
const type = this.inferPatternType(pattern);
|
|
37
|
+
const confidence = this.calculateClassificationConfidence(pattern, type);
|
|
38
|
+
const reasoning = this.generateReasoning(pattern, type);
|
|
39
|
+
const alternatives = this.getAlternativeClassifications(pattern, type);
|
|
40
|
+
return {
|
|
41
|
+
patternId: pattern.id,
|
|
42
|
+
type,
|
|
43
|
+
confidence,
|
|
44
|
+
reasoning,
|
|
45
|
+
alternatives
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Calculate similarity between two patterns
|
|
50
|
+
*/
|
|
51
|
+
async calculateSimilarity(pattern1Id, pattern2Id) {
|
|
52
|
+
const pattern1 = this.patterns.get(pattern1Id);
|
|
53
|
+
const pattern2 = this.patterns.get(pattern2Id);
|
|
54
|
+
if (!pattern1 || !pattern2) {
|
|
55
|
+
throw new Error('Pattern not found');
|
|
56
|
+
}
|
|
57
|
+
const details = await this.calculateSimilarityDetails(pattern1, pattern2);
|
|
58
|
+
const score = this.aggregateSimilarityScore(details);
|
|
59
|
+
return {
|
|
60
|
+
pattern1: pattern1Id,
|
|
61
|
+
pattern2: pattern2Id,
|
|
62
|
+
score,
|
|
63
|
+
details
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Recommend patterns for given code
|
|
68
|
+
*/
|
|
69
|
+
async recommendPatterns(sourceCode, limit = 5) {
|
|
70
|
+
// Generate signature for target code
|
|
71
|
+
const signature = await this.signatureGenerator.generate(sourceCode);
|
|
72
|
+
const recommendations = [];
|
|
73
|
+
// Calculate applicability for each pattern
|
|
74
|
+
for (const pattern of this.patterns.values()) {
|
|
75
|
+
const applicability = this.calculateApplicability(signature, pattern);
|
|
76
|
+
const score = applicability * pattern.confidence;
|
|
77
|
+
recommendations.push({
|
|
78
|
+
patternId: pattern.id,
|
|
79
|
+
patternName: pattern.name,
|
|
80
|
+
score,
|
|
81
|
+
reason: this.generateRecommendationReason(signature, pattern, applicability),
|
|
82
|
+
targetCode: sourceCode,
|
|
83
|
+
applicability
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Sort by score and return top recommendations
|
|
87
|
+
return recommendations
|
|
88
|
+
.sort((a, b) => b.score - a.score)
|
|
89
|
+
.slice(0, limit);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Find similar patterns
|
|
93
|
+
*/
|
|
94
|
+
async findSimilarPatterns(patternId, threshold = 0.7, limit = 5) {
|
|
95
|
+
const targetPattern = this.patterns.get(patternId);
|
|
96
|
+
if (!targetPattern) {
|
|
97
|
+
throw new Error(`Pattern ${patternId} not found`);
|
|
98
|
+
}
|
|
99
|
+
const similarities = [];
|
|
100
|
+
for (const pattern of this.patterns.values()) {
|
|
101
|
+
if (pattern.id === patternId)
|
|
102
|
+
continue;
|
|
103
|
+
const similarity = await this.calculateSimilarity(patternId, pattern.id);
|
|
104
|
+
if (similarity.score >= threshold) {
|
|
105
|
+
similarities.push(similarity);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return similarities
|
|
109
|
+
.sort((a, b) => b.score - a.score)
|
|
110
|
+
.slice(0, limit);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Infer pattern type from pattern characteristics
|
|
114
|
+
*/
|
|
115
|
+
inferPatternType(pattern) {
|
|
116
|
+
const name = pattern.name.toLowerCase();
|
|
117
|
+
const examples = pattern.examples.join(' ').toLowerCase();
|
|
118
|
+
// Check for specific keywords
|
|
119
|
+
if (name.includes('edge') || name.includes('null') || name.includes('undefined')) {
|
|
120
|
+
return pattern_types_1.PatternType.EDGE_CASE;
|
|
121
|
+
}
|
|
122
|
+
if (name.includes('boundary') || name.includes('range') || examples.includes('>=')) {
|
|
123
|
+
return pattern_types_1.PatternType.BOUNDARY_CONDITION;
|
|
124
|
+
}
|
|
125
|
+
if (name.includes('error') || examples.includes('throw') || examples.includes('catch')) {
|
|
126
|
+
return pattern_types_1.PatternType.ERROR_HANDLING;
|
|
127
|
+
}
|
|
128
|
+
if (name.includes('mock') || examples.includes('mock') || examples.includes('stub')) {
|
|
129
|
+
return pattern_types_1.PatternType.MOCK_PATTERN;
|
|
130
|
+
}
|
|
131
|
+
if (name.includes('async') || examples.includes('async') || examples.includes('await')) {
|
|
132
|
+
return pattern_types_1.PatternType.ASYNC_PATTERN;
|
|
133
|
+
}
|
|
134
|
+
if (examples.includes('expect(')) {
|
|
135
|
+
return pattern_types_1.PatternType.ASSERTION_PATTERN;
|
|
136
|
+
}
|
|
137
|
+
if (name.includes('setup') || name.includes('teardown') || name.includes('before') || name.includes('after')) {
|
|
138
|
+
return pattern_types_1.PatternType.SETUP_TEARDOWN;
|
|
139
|
+
}
|
|
140
|
+
// Default to assertion pattern
|
|
141
|
+
return pattern_types_1.PatternType.ASSERTION_PATTERN;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Calculate classification confidence
|
|
145
|
+
*/
|
|
146
|
+
calculateClassificationConfidence(pattern, type) {
|
|
147
|
+
let confidence = 0.5; // Base confidence
|
|
148
|
+
const name = pattern.name.toLowerCase();
|
|
149
|
+
const examples = pattern.examples.join(' ').toLowerCase();
|
|
150
|
+
// Increase confidence based on evidence
|
|
151
|
+
const typeKeywords = this.getTypeKeywords(type);
|
|
152
|
+
const matchCount = typeKeywords.filter(kw => name.includes(kw) || examples.includes(kw)).length;
|
|
153
|
+
confidence += (matchCount / typeKeywords.length) * 0.4;
|
|
154
|
+
// Adjust by pattern frequency
|
|
155
|
+
if (pattern.frequency > 5)
|
|
156
|
+
confidence += 0.1;
|
|
157
|
+
return Math.min(confidence, 1.0);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get keywords for pattern type
|
|
161
|
+
*/
|
|
162
|
+
getTypeKeywords(type) {
|
|
163
|
+
const keywordMap = {
|
|
164
|
+
[pattern_types_1.PatternType.EDGE_CASE]: ['edge', 'null', 'undefined', 'empty', 'zero', 'max', 'min'],
|
|
165
|
+
[pattern_types_1.PatternType.BOUNDARY_CONDITION]: ['boundary', 'range', 'limit', 'threshold', '>=', '<='],
|
|
166
|
+
[pattern_types_1.PatternType.ERROR_HANDLING]: ['error', 'throw', 'catch', 'try', 'reject'],
|
|
167
|
+
[pattern_types_1.PatternType.INTEGRATION]: ['integration', 'api', 'database', 'external'],
|
|
168
|
+
[pattern_types_1.PatternType.ASYNC_PATTERN]: ['async', 'await', 'promise', 'then', 'callback'],
|
|
169
|
+
[pattern_types_1.PatternType.MOCK_PATTERN]: ['mock', 'stub', 'spy', 'jest.fn', 'sinon'],
|
|
170
|
+
[pattern_types_1.PatternType.ASSERTION_PATTERN]: ['expect', 'assert', 'should', 'toBe', 'toEqual'],
|
|
171
|
+
[pattern_types_1.PatternType.SETUP_TEARDOWN]: ['setup', 'teardown', 'before', 'after', 'beforeEach'],
|
|
172
|
+
[pattern_types_1.PatternType.DATA_DRIVEN]: ['each', 'table', 'cases', 'data'],
|
|
173
|
+
[pattern_types_1.PatternType.PARAMETERIZED]: ['parameterized', 'test.each', 'describe.each']
|
|
174
|
+
};
|
|
175
|
+
return keywordMap[type] || [];
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Generate reasoning for classification
|
|
179
|
+
*/
|
|
180
|
+
generateReasoning(pattern, type) {
|
|
181
|
+
const keywords = this.getTypeKeywords(type);
|
|
182
|
+
const name = pattern.name.toLowerCase();
|
|
183
|
+
const matchedKeywords = keywords.filter(kw => name.includes(kw));
|
|
184
|
+
if (matchedKeywords.length > 0) {
|
|
185
|
+
return `Pattern classified as ${type} based on keywords: ${matchedKeywords.join(', ')}`;
|
|
186
|
+
}
|
|
187
|
+
return `Pattern classified as ${type} based on structural analysis`;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get alternative classifications
|
|
191
|
+
*/
|
|
192
|
+
getAlternativeClassifications(pattern, primaryType) {
|
|
193
|
+
const alternatives = [];
|
|
194
|
+
const types = Object.values(pattern_types_1.PatternType).filter(t => t !== primaryType);
|
|
195
|
+
for (const type of types) {
|
|
196
|
+
const confidence = this.calculateClassificationConfidence(pattern, type);
|
|
197
|
+
if (confidence > 0.3) {
|
|
198
|
+
alternatives.push({ type, confidence });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return alternatives.sort((a, b) => b.confidence - a.confidence).slice(0, 3);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Calculate detailed similarity metrics
|
|
205
|
+
*/
|
|
206
|
+
async calculateSimilarityDetails(pattern1, pattern2) {
|
|
207
|
+
const structuralSimilarity = this.calculateStructuralSimilarity(pattern1, pattern2);
|
|
208
|
+
const semanticSimilarity = this.calculateSemanticSimilarity(pattern1, pattern2);
|
|
209
|
+
const typeCompatibility = this.calculateTypeCompatibility(pattern1, pattern2);
|
|
210
|
+
const commonPatterns = this.findCommonPatterns(pattern1, pattern2);
|
|
211
|
+
return {
|
|
212
|
+
structuralSimilarity,
|
|
213
|
+
semanticSimilarity,
|
|
214
|
+
typeCompatibility,
|
|
215
|
+
commonPatterns
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Calculate structural similarity
|
|
220
|
+
*/
|
|
221
|
+
calculateStructuralSimilarity(pattern1, pattern2) {
|
|
222
|
+
// Compare template structures
|
|
223
|
+
const params1 = pattern1.template.parameters.length;
|
|
224
|
+
const params2 = pattern2.template.parameters.length;
|
|
225
|
+
const paramSimilarity = 1 - Math.abs(params1 - params2) / Math.max(params1, params2, 1);
|
|
226
|
+
const categoryMatch = pattern1.category === pattern2.category ? 1 : 0;
|
|
227
|
+
const frameworkMatch = pattern1.framework === pattern2.framework ? 1 : 0.7;
|
|
228
|
+
return (paramSimilarity + categoryMatch + frameworkMatch) / 3;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Calculate semantic similarity
|
|
232
|
+
*/
|
|
233
|
+
calculateSemanticSimilarity(pattern1, pattern2) {
|
|
234
|
+
// Compare names and descriptions
|
|
235
|
+
const name1Words = pattern1.name.toLowerCase().split(/\s+/);
|
|
236
|
+
const name2Words = pattern2.name.toLowerCase().split(/\s+/);
|
|
237
|
+
const commonWords = name1Words.filter(w => name2Words.includes(w));
|
|
238
|
+
const totalWords = new Set([...name1Words, ...name2Words]).size;
|
|
239
|
+
return commonWords.length / Math.max(totalWords, 1);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Calculate type compatibility
|
|
243
|
+
*/
|
|
244
|
+
calculateTypeCompatibility(pattern1, pattern2) {
|
|
245
|
+
if (pattern1.type === pattern2.type)
|
|
246
|
+
return 1.0;
|
|
247
|
+
// Check if types are related
|
|
248
|
+
const relatedTypes = {
|
|
249
|
+
[pattern_types_1.PatternType.EDGE_CASE]: [pattern_types_1.PatternType.BOUNDARY_CONDITION],
|
|
250
|
+
[pattern_types_1.PatternType.BOUNDARY_CONDITION]: [pattern_types_1.PatternType.EDGE_CASE],
|
|
251
|
+
[pattern_types_1.PatternType.ERROR_HANDLING]: [pattern_types_1.PatternType.ASYNC_PATTERN],
|
|
252
|
+
[pattern_types_1.PatternType.ASYNC_PATTERN]: [pattern_types_1.PatternType.ERROR_HANDLING, pattern_types_1.PatternType.INTEGRATION],
|
|
253
|
+
[pattern_types_1.PatternType.MOCK_PATTERN]: [pattern_types_1.PatternType.INTEGRATION],
|
|
254
|
+
[pattern_types_1.PatternType.INTEGRATION]: [pattern_types_1.PatternType.ASYNC_PATTERN, pattern_types_1.PatternType.MOCK_PATTERN],
|
|
255
|
+
[pattern_types_1.PatternType.ASSERTION_PATTERN]: [],
|
|
256
|
+
[pattern_types_1.PatternType.SETUP_TEARDOWN]: [],
|
|
257
|
+
[pattern_types_1.PatternType.DATA_DRIVEN]: [pattern_types_1.PatternType.PARAMETERIZED],
|
|
258
|
+
[pattern_types_1.PatternType.PARAMETERIZED]: [pattern_types_1.PatternType.DATA_DRIVEN]
|
|
259
|
+
};
|
|
260
|
+
const related = relatedTypes[pattern1.type] || [];
|
|
261
|
+
return related.includes(pattern2.type) ? 0.5 : 0.0;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Find common patterns
|
|
265
|
+
*/
|
|
266
|
+
findCommonPatterns(pattern1, pattern2) {
|
|
267
|
+
const common = [];
|
|
268
|
+
if (pattern1.type === pattern2.type) {
|
|
269
|
+
common.push(`same-type:${pattern1.type}`);
|
|
270
|
+
}
|
|
271
|
+
if (pattern1.framework === pattern2.framework) {
|
|
272
|
+
common.push(`same-framework:${pattern1.framework}`);
|
|
273
|
+
}
|
|
274
|
+
if (pattern1.category === pattern2.category) {
|
|
275
|
+
common.push(`same-category:${pattern1.category}`);
|
|
276
|
+
}
|
|
277
|
+
return common;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Aggregate similarity score
|
|
281
|
+
*/
|
|
282
|
+
aggregateSimilarityScore(details) {
|
|
283
|
+
const weights = {
|
|
284
|
+
structural: 0.4,
|
|
285
|
+
semantic: 0.3,
|
|
286
|
+
typeCompatibility: 0.3
|
|
287
|
+
};
|
|
288
|
+
return (details.structuralSimilarity * weights.structural +
|
|
289
|
+
details.semanticSimilarity * weights.semantic +
|
|
290
|
+
details.typeCompatibility * weights.typeCompatibility);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Calculate applicability of pattern to code
|
|
294
|
+
*/
|
|
295
|
+
calculateApplicability(signature, pattern) {
|
|
296
|
+
let score = 0.5; // Base score
|
|
297
|
+
// Check for matching patterns in signature
|
|
298
|
+
const matchingPatterns = signature.patterns.filter(p => p.type === pattern.type);
|
|
299
|
+
if (matchingPatterns.length > 0) {
|
|
300
|
+
score += 0.3;
|
|
301
|
+
}
|
|
302
|
+
// Check applicability conditions
|
|
303
|
+
const conditions = pattern.applicabilityConditions;
|
|
304
|
+
const signatureInfo = `${signature.functionSignature} ${signature.nodeTypes.join(' ')}`.toLowerCase();
|
|
305
|
+
const matchedConditions = conditions.filter(condition => signatureInfo.includes(condition.toLowerCase()));
|
|
306
|
+
score += (matchedConditions.length / Math.max(conditions.length, 1)) * 0.2;
|
|
307
|
+
return Math.min(score, 1.0);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Generate recommendation reason
|
|
311
|
+
*/
|
|
312
|
+
generateRecommendationReason(signature, pattern, applicability) {
|
|
313
|
+
const reasons = [];
|
|
314
|
+
if (applicability > 0.8) {
|
|
315
|
+
reasons.push('Highly applicable based on code signature');
|
|
316
|
+
}
|
|
317
|
+
else if (applicability > 0.6) {
|
|
318
|
+
reasons.push('Moderately applicable');
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
reasons.push('Potentially applicable');
|
|
322
|
+
}
|
|
323
|
+
if (signature.patterns.some(p => p.type === pattern.type)) {
|
|
324
|
+
reasons.push(`Matching ${pattern.type} pattern detected`);
|
|
325
|
+
}
|
|
326
|
+
if (signature.complexity > 5) {
|
|
327
|
+
reasons.push('High complexity suggests comprehensive testing needed');
|
|
328
|
+
}
|
|
329
|
+
return reasons.join('. ') + '.';
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Get all loaded patterns
|
|
333
|
+
*/
|
|
334
|
+
getPatterns() {
|
|
335
|
+
return Array.from(this.patterns.values());
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Get pattern by ID
|
|
339
|
+
*/
|
|
340
|
+
getPattern(id) {
|
|
341
|
+
return this.patterns.get(id);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
exports.PatternClassifier = PatternClassifier;
|
|
345
|
+
//# sourceMappingURL=PatternClassifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PatternClassifier.js","sourceRoot":"","sources":["../../src/reasoning/PatternClassifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatternExtractor - AST-based pattern extraction from test suites
|
|
3
|
+
* Phase 2 (v1.1.0) - Pattern Extraction Specialist
|
|
4
|
+
*
|
|
5
|
+
* Extracts reusable patterns from existing test suites including:
|
|
6
|
+
* - Edge cases and boundary conditions
|
|
7
|
+
* - Error handling patterns
|
|
8
|
+
* - Mock and assertion patterns
|
|
9
|
+
* - Integration patterns
|
|
10
|
+
*
|
|
11
|
+
* Performance: Process 100+ test files in < 5 seconds
|
|
12
|
+
* Accuracy: > 85% pattern extraction accuracy
|
|
13
|
+
*/
|
|
14
|
+
import { TestPattern, PatternExtractionResult, PatternExtractionConfig } from '../types/pattern.types';
|
|
15
|
+
/**
|
|
16
|
+
* Main pattern extractor class
|
|
17
|
+
*/
|
|
18
|
+
export declare class PatternExtractor {
|
|
19
|
+
private logger;
|
|
20
|
+
private config;
|
|
21
|
+
private extractedPatterns;
|
|
22
|
+
private patternFrequency;
|
|
23
|
+
constructor(config?: Partial<PatternExtractionConfig>);
|
|
24
|
+
/**
|
|
25
|
+
* Extract patterns from multiple test files
|
|
26
|
+
*/
|
|
27
|
+
extractFromFiles(filePaths: string[]): Promise<PatternExtractionResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Extract patterns from a single test file
|
|
30
|
+
*/
|
|
31
|
+
extractFromFile(filePath: string): Promise<TestPattern[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Parse source code to AST
|
|
34
|
+
*/
|
|
35
|
+
private parseCode;
|
|
36
|
+
/**
|
|
37
|
+
* Detect test framework from source code
|
|
38
|
+
* Checks framework-specific indicators in priority order
|
|
39
|
+
*/
|
|
40
|
+
private detectFramework;
|
|
41
|
+
/**
|
|
42
|
+
* Extract edge case patterns
|
|
43
|
+
*/
|
|
44
|
+
private extractEdgeCasePatterns;
|
|
45
|
+
/**
|
|
46
|
+
* Extract boundary condition patterns
|
|
47
|
+
*/
|
|
48
|
+
private extractBoundaryConditionPatterns;
|
|
49
|
+
/**
|
|
50
|
+
* Extract error handling patterns
|
|
51
|
+
*/
|
|
52
|
+
private extractErrorHandlingPatterns;
|
|
53
|
+
/**
|
|
54
|
+
* Extract mock patterns
|
|
55
|
+
*/
|
|
56
|
+
private extractMockPatterns;
|
|
57
|
+
/**
|
|
58
|
+
* Extract assertion patterns
|
|
59
|
+
*/
|
|
60
|
+
private extractAssertionPatterns;
|
|
61
|
+
/**
|
|
62
|
+
* Extract async patterns
|
|
63
|
+
*/
|
|
64
|
+
private extractAsyncPatterns;
|
|
65
|
+
/**
|
|
66
|
+
* Create a test pattern from AST node
|
|
67
|
+
*/
|
|
68
|
+
private createPattern;
|
|
69
|
+
/**
|
|
70
|
+
* Traverse AST and apply visitor function
|
|
71
|
+
*/
|
|
72
|
+
private traverseAST;
|
|
73
|
+
/**
|
|
74
|
+
* Check if node is a test block
|
|
75
|
+
*/
|
|
76
|
+
private isTestBlock;
|
|
77
|
+
/**
|
|
78
|
+
* Get test name from node
|
|
79
|
+
*/
|
|
80
|
+
private getTestName;
|
|
81
|
+
/**
|
|
82
|
+
* Get code from node
|
|
83
|
+
*/
|
|
84
|
+
private getNodeCode;
|
|
85
|
+
/**
|
|
86
|
+
* Count assertions in test block
|
|
87
|
+
*/
|
|
88
|
+
private countAssertions;
|
|
89
|
+
/**
|
|
90
|
+
* Get node location
|
|
91
|
+
*/
|
|
92
|
+
private getLocation;
|
|
93
|
+
/**
|
|
94
|
+
* Generate pattern ID
|
|
95
|
+
*/
|
|
96
|
+
private generatePatternId;
|
|
97
|
+
/**
|
|
98
|
+
* Infer pattern category from type
|
|
99
|
+
*/
|
|
100
|
+
private inferCategory;
|
|
101
|
+
/**
|
|
102
|
+
* Infer applicability conditions
|
|
103
|
+
*/
|
|
104
|
+
private inferApplicabilityConditions;
|
|
105
|
+
/**
|
|
106
|
+
* Create empty template (to be filled by TestTemplateCreator)
|
|
107
|
+
*/
|
|
108
|
+
private createEmptyTemplate;
|
|
109
|
+
/**
|
|
110
|
+
* Count tests in file
|
|
111
|
+
*/
|
|
112
|
+
private countTestsInFile;
|
|
113
|
+
/**
|
|
114
|
+
* Calculate extraction statistics
|
|
115
|
+
*/
|
|
116
|
+
private calculateStatistics;
|
|
117
|
+
/**
|
|
118
|
+
* Deduplicate patterns by normalizing names and merging similar patterns
|
|
119
|
+
*/
|
|
120
|
+
private deduplicatePatterns;
|
|
121
|
+
/**
|
|
122
|
+
* Normalize pattern name for deduplication
|
|
123
|
+
* Removes trailing numbers, extra whitespace, and normalizes case
|
|
124
|
+
*/
|
|
125
|
+
private normalizePatternName;
|
|
126
|
+
/**
|
|
127
|
+
* Get extracted patterns
|
|
128
|
+
*/
|
|
129
|
+
getPatterns(): TestPattern[];
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=PatternExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PatternExtractor.d.ts","sourceRoot":"","sources":["../../src/reasoning/PatternExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EACL,WAAW,EAMX,uBAAuB,EACvB,uBAAuB,EAIxB,MAAM,wBAAwB,CAAC;AAGhC;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,gBAAgB,CAAsB;gBAElC,MAAM,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC;IAqBrD;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAoC7E;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAqB/D;;OAEG;IACH,OAAO,CAAC,SAAS;IAqBjB;;;OAGG;IACH,OAAO,CAAC,eAAe;IA6BvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+B/B;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAgCxC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA+BpC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2B3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAwBhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;OAEG;IACH,OAAO,CAAC,aAAa;IA+BrB;;OAEG;IACH,OAAO,CAAC,WAAW;IAoBnB;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAavB;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgBrB;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAgBpC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;CAG7B"}
|