agentic-qe 1.3.3 → 1.3.4
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-api-contract-validator.md +20 -0
- package/.claude/agents/qe-chaos-engineer.md +20 -0
- package/.claude/agents/qe-coverage-analyzer.md +21 -0
- package/.claude/agents/qe-deployment-readiness.md +20 -0
- package/.claude/agents/qe-flaky-test-hunter.md +20 -0
- package/.claude/agents/qe-fleet-commander.md +20 -0
- package/.claude/agents/qe-performance-tester.md +21 -0
- package/.claude/agents/qe-production-intelligence.md +20 -0
- package/.claude/agents/qe-quality-analyzer.md +20 -0
- package/.claude/agents/qe-quality-gate.md +20 -0
- package/.claude/agents/qe-regression-risk-analyzer.md +20 -0
- package/.claude/agents/qe-requirements-validator.md +20 -0
- package/.claude/agents/qe-security-scanner.md +21 -0
- package/.claude/agents/qe-test-data-architect.md +19 -0
- package/.claude/agents/qe-test-executor.md +20 -0
- package/.claude/agents/qe-test-generator.md +22 -0
- package/.claude/agents/qe-visual-tester.md +22 -0
- package/README.md +320 -1019
- package/README.md.backup-20251026 +1366 -0
- package/bin/aqe-mcp +1 -1
- package/dist/agents/BaseAgent.js +1 -1
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +16 -16
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/FlakyTestHunterAgent.js +1 -1
- package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +71 -37
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/core/memory/EnhancedAgentDBService.d.ts +127 -0
- package/dist/core/memory/EnhancedAgentDBService.d.ts.map +1 -0
- package/dist/core/memory/EnhancedAgentDBService.js +298 -0
- package/dist/core/memory/EnhancedAgentDBService.js.map +1 -0
- package/dist/core/neural/NeuralTrainer.js +2 -2
- package/dist/core/neural/NeuralTrainer.js.map +1 -1
- package/dist/learning/FixRecommendationEngine.d.ts +68 -0
- package/dist/learning/FixRecommendationEngine.d.ts.map +1 -0
- package/dist/learning/FixRecommendationEngine.js +500 -0
- package/dist/learning/FixRecommendationEngine.js.map +1 -0
- package/dist/learning/FlakyTestDetector.d.ts +19 -0
- package/dist/learning/FlakyTestDetector.d.ts.map +1 -1
- package/dist/learning/FlakyTestDetector.js +121 -2
- package/dist/learning/FlakyTestDetector.js.map +1 -1
- package/dist/learning/index.d.ts +2 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +5 -0
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/types.d.ts +11 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/reasoning/PatternQualityScorer.d.ts +134 -0
- package/dist/reasoning/PatternQualityScorer.d.ts.map +1 -0
- package/dist/reasoning/PatternQualityScorer.js +340 -0
- package/dist/reasoning/PatternQualityScorer.js.map +1 -0
- package/dist/reasoning/QEReasoningBank.d.ts +51 -4
- package/dist/reasoning/QEReasoningBank.d.ts.map +1 -1
- package/dist/reasoning/QEReasoningBank.js +173 -11
- package/dist/reasoning/QEReasoningBank.js.map +1 -1
- package/dist/reasoning/VectorSimilarity.d.ts +131 -0
- package/dist/reasoning/VectorSimilarity.d.ts.map +1 -0
- package/dist/reasoning/VectorSimilarity.js +250 -0
- package/dist/reasoning/VectorSimilarity.js.map +1 -0
- package/dist/reasoning/index.d.ts +8 -1
- package/dist/reasoning/index.d.ts.map +1 -1
- package/dist/reasoning/index.js +13 -2
- package/dist/reasoning/index.js.map +1 -1
- package/dist/streaming/BaseStreamHandler.d.ts +89 -0
- package/dist/streaming/BaseStreamHandler.d.ts.map +1 -0
- package/dist/streaming/BaseStreamHandler.js +168 -0
- package/dist/streaming/BaseStreamHandler.js.map +1 -0
- package/dist/streaming/TestGenerateStreamHandler.d.ts +103 -0
- package/dist/streaming/TestGenerateStreamHandler.d.ts.map +1 -0
- package/dist/streaming/TestGenerateStreamHandler.js +321 -0
- package/dist/streaming/TestGenerateStreamHandler.js.map +1 -0
- package/dist/streaming/index.d.ts +16 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +39 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/utils/__mocks__/Logger.d.ts +26 -0
- package/dist/utils/__mocks__/Logger.d.ts.map +1 -0
- package/dist/utils/__mocks__/Logger.js +42 -0
- package/dist/utils/__mocks__/Logger.js.map +1 -0
- package/package.json +15 -3
- package/dist/agents/mixins/NeuralCapableMixin.d.ts +0 -130
- package/dist/agents/mixins/NeuralCapableMixin.d.ts.map +0 -1
- package/dist/agents/mixins/NeuralCapableMixin.js +0 -358
- package/dist/agents/mixins/NeuralCapableMixin.js.map +0 -1
- package/dist/agents/mixins/QUICCapableMixin.d.ts +0 -34
- package/dist/agents/mixins/QUICCapableMixin.d.ts.map +0 -1
- package/dist/agents/mixins/QUICCapableMixin.js +0 -346
- package/dist/agents/mixins/QUICCapableMixin.js.map +0 -1
- package/dist/core/security/CertificateValidator.d.ts +0 -130
- package/dist/core/security/CertificateValidator.d.ts.map +0 -1
- package/dist/core/security/CertificateValidator.js +0 -376
- package/dist/core/security/CertificateValidator.js.map +0 -1
- package/dist/core/transport/QUICTransport.d.ts +0 -62
- package/dist/core/transport/QUICTransport.d.ts.map +0 -1
- package/dist/core/transport/QUICTransport.js +0 -381
- package/dist/core/transport/QUICTransport.js.map +0 -1
- package/dist/core/transport/SecureQUICTransport.d.ts +0 -71
- package/dist/core/transport/SecureQUICTransport.d.ts.map +0 -1
- package/dist/core/transport/SecureQUICTransport.js +0 -253
- package/dist/core/transport/SecureQUICTransport.js.map +0 -1
- package/dist/learning/AdvancedFeatureExtractor.d.ts +0 -123
- package/dist/learning/AdvancedFeatureExtractor.d.ts.map +0 -1
- package/dist/learning/AdvancedFeatureExtractor.js +0 -423
- package/dist/learning/AdvancedFeatureExtractor.js.map +0 -1
- package/dist/learning/NeuralPatternMatcher.d.ts +0 -184
- package/dist/learning/NeuralPatternMatcher.d.ts.map +0 -1
- package/dist/learning/NeuralPatternMatcher.js +0 -702
- package/dist/learning/NeuralPatternMatcher.js.map +0 -1
- package/dist/learning/NeuralTrainer.d.ts +0 -209
- package/dist/learning/NeuralTrainer.d.ts.map +0 -1
- package/dist/learning/NeuralTrainer.js +0 -478
- package/dist/learning/NeuralTrainer.js.map +0 -1
- package/dist/transport/QUICTransport.d.ts +0 -340
- package/dist/transport/QUICTransport.d.ts.map +0 -1
- package/dist/transport/QUICTransport.js +0 -814
- package/dist/transport/QUICTransport.js.map +0 -1
- package/dist/transport/UDPTransport.d.ts +0 -348
- package/dist/transport/UDPTransport.d.ts.map +0 -1
- package/dist/transport/UDPTransport.js +0 -820
- package/dist/transport/UDPTransport.js.map +0 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Generation Streaming Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides real-time progress updates for AI-powered test generation.
|
|
5
|
+
* Emits progress for each function/module as tests are generated.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @author Agentic QE Team
|
|
9
|
+
*/
|
|
10
|
+
import { BaseStreamHandler, StreamEvent } from './BaseStreamHandler';
|
|
11
|
+
export interface TestGenerateParams {
|
|
12
|
+
sourceFile: string;
|
|
13
|
+
framework: 'jest' | 'mocha' | 'vitest';
|
|
14
|
+
testType?: 'unit' | 'integration' | 'e2e';
|
|
15
|
+
coverage?: number;
|
|
16
|
+
includeEdgeCases?: boolean;
|
|
17
|
+
generateMocks?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface FunctionAnalysis {
|
|
20
|
+
name: string;
|
|
21
|
+
params: string[];
|
|
22
|
+
returnType?: string;
|
|
23
|
+
complexity: number;
|
|
24
|
+
isAsync: boolean;
|
|
25
|
+
isExported: boolean;
|
|
26
|
+
lineStart: number;
|
|
27
|
+
lineEnd: number;
|
|
28
|
+
}
|
|
29
|
+
export interface GeneratedTest {
|
|
30
|
+
functionName: string;
|
|
31
|
+
testCode: string;
|
|
32
|
+
testCount: number;
|
|
33
|
+
coverageEstimate: number;
|
|
34
|
+
includesEdgeCases: boolean;
|
|
35
|
+
includesMocks: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface TestGenerateResult {
|
|
38
|
+
sourceFile: string;
|
|
39
|
+
framework: string;
|
|
40
|
+
tests: GeneratedTest[];
|
|
41
|
+
totalTests: number;
|
|
42
|
+
estimatedCoverage: number;
|
|
43
|
+
generationTime: number;
|
|
44
|
+
outputFile: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Streaming handler for test generation with real-time progress
|
|
48
|
+
*/
|
|
49
|
+
export declare class TestGenerateStreamHandler extends BaseStreamHandler {
|
|
50
|
+
/**
|
|
51
|
+
* Process test generation task with incremental progress updates
|
|
52
|
+
*/
|
|
53
|
+
protected processTask(params: TestGenerateParams): AsyncGenerator<StreamEvent>;
|
|
54
|
+
/**
|
|
55
|
+
* Validate source file exists and is readable
|
|
56
|
+
*/
|
|
57
|
+
private validateSourceFile;
|
|
58
|
+
/**
|
|
59
|
+
* Analyze source file to extract functions
|
|
60
|
+
*/
|
|
61
|
+
private analyzeSourceFile;
|
|
62
|
+
/**
|
|
63
|
+
* Extract function information from AST node
|
|
64
|
+
*/
|
|
65
|
+
private extractFunctionInfo;
|
|
66
|
+
/**
|
|
67
|
+
* Estimate cyclomatic complexity
|
|
68
|
+
*/
|
|
69
|
+
private estimateComplexity;
|
|
70
|
+
/**
|
|
71
|
+
* Check if function is exported
|
|
72
|
+
*/
|
|
73
|
+
private isExported;
|
|
74
|
+
/**
|
|
75
|
+
* Generate test for a single function
|
|
76
|
+
*/
|
|
77
|
+
private generateTestForFunction;
|
|
78
|
+
/**
|
|
79
|
+
* Generate happy path test
|
|
80
|
+
*/
|
|
81
|
+
private generateHappyPathTest;
|
|
82
|
+
/**
|
|
83
|
+
* Generate edge case tests
|
|
84
|
+
*/
|
|
85
|
+
private generateEdgeCaseTests;
|
|
86
|
+
/**
|
|
87
|
+
* Generate error handling test
|
|
88
|
+
*/
|
|
89
|
+
private generateErrorTest;
|
|
90
|
+
/**
|
|
91
|
+
* Generate test file with all tests
|
|
92
|
+
*/
|
|
93
|
+
private generateTestFile;
|
|
94
|
+
/**
|
|
95
|
+
* Generate import statements
|
|
96
|
+
*/
|
|
97
|
+
private generateImports;
|
|
98
|
+
/**
|
|
99
|
+
* Calculate estimated coverage
|
|
100
|
+
*/
|
|
101
|
+
private calculateCoverageEstimate;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=TestGenerateStreamHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestGenerateStreamHandler.d.ts","sourceRoot":"","sources":["../../src/streaming/TestGenerateStreamHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMrE,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,iBAAiB;IAC9D;;OAEG;cACc,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,WAAW,CAAC;IAsFrF;;OAEG;YACW,kBAAkB;IAQhC;;OAEG;YACW,iBAAiB;IA2C/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;OAEG;YACW,uBAAuB;IAuCrC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;YACW,gBAAgB;IAmB9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,yBAAyB;CAIlC"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test Generation Streaming Handler
|
|
4
|
+
*
|
|
5
|
+
* Provides real-time progress updates for AI-powered test generation.
|
|
6
|
+
* Emits progress for each function/module as tests are generated.
|
|
7
|
+
*
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
* @author Agentic QE Team
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.TestGenerateStreamHandler = void 0;
|
|
49
|
+
const BaseStreamHandler_1 = require("./BaseStreamHandler");
|
|
50
|
+
const fs = __importStar(require("fs/promises"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const parser_1 = require("@babel/parser");
|
|
53
|
+
const traverse_1 = __importDefault(require("@babel/traverse"));
|
|
54
|
+
/**
|
|
55
|
+
* Streaming handler for test generation with real-time progress
|
|
56
|
+
*/
|
|
57
|
+
class TestGenerateStreamHandler extends BaseStreamHandler_1.BaseStreamHandler {
|
|
58
|
+
/**
|
|
59
|
+
* Process test generation task with incremental progress updates
|
|
60
|
+
*/
|
|
61
|
+
async *processTask(params) {
|
|
62
|
+
const { sourceFile, framework, testType = 'unit', coverage = 80, includeEdgeCases = true, generateMocks = true } = params;
|
|
63
|
+
// Validate source file exists
|
|
64
|
+
yield this.progressEvent(5, `Validating source file: ${sourceFile}`);
|
|
65
|
+
await this.validateSourceFile(sourceFile);
|
|
66
|
+
// Analyze source file
|
|
67
|
+
yield this.progressEvent(10, 'Analyzing source file...');
|
|
68
|
+
const analysis = await this.analyzeSourceFile(sourceFile);
|
|
69
|
+
yield this.progressEvent(20, `Found ${analysis.functions.length} functions to test`, {
|
|
70
|
+
functionsFound: analysis.functions.length,
|
|
71
|
+
totalLines: analysis.totalLines
|
|
72
|
+
});
|
|
73
|
+
// Generate tests for each function
|
|
74
|
+
const tests = [];
|
|
75
|
+
const totalFunctions = analysis.functions.length;
|
|
76
|
+
for (let i = 0; i < totalFunctions; i++) {
|
|
77
|
+
if (this.isCancelled()) {
|
|
78
|
+
throw new Error('Test generation cancelled');
|
|
79
|
+
}
|
|
80
|
+
const func = analysis.functions[i];
|
|
81
|
+
const progress = 20 + ((i / totalFunctions) * 60);
|
|
82
|
+
yield this.progressEvent(progress, `Generating tests for ${func.name}...`, {
|
|
83
|
+
currentFunction: func.name,
|
|
84
|
+
functionsCompleted: i,
|
|
85
|
+
functionsTotal: totalFunctions
|
|
86
|
+
});
|
|
87
|
+
const generatedTest = await this.generateTestForFunction(func, framework, { includeEdgeCases, generateMocks, coverage });
|
|
88
|
+
tests.push(generatedTest);
|
|
89
|
+
// Emit intermediate result
|
|
90
|
+
yield this.resultEvent(generatedTest, {
|
|
91
|
+
type: 'intermediate',
|
|
92
|
+
progress: i + 1,
|
|
93
|
+
total: totalFunctions
|
|
94
|
+
});
|
|
95
|
+
// Small delay to simulate AI generation (in real impl, this would be LLM call)
|
|
96
|
+
await this.sleep(100);
|
|
97
|
+
}
|
|
98
|
+
// Generate output file
|
|
99
|
+
yield this.progressEvent(85, 'Generating test file...');
|
|
100
|
+
const outputFile = await this.generateTestFile(sourceFile, tests, framework);
|
|
101
|
+
yield this.progressEvent(95, 'Calculating coverage estimate...');
|
|
102
|
+
const estimatedCoverage = this.calculateCoverageEstimate(tests, analysis.totalLines);
|
|
103
|
+
// Final result
|
|
104
|
+
const result = {
|
|
105
|
+
sourceFile,
|
|
106
|
+
framework,
|
|
107
|
+
tests,
|
|
108
|
+
totalTests: tests.reduce((sum, t) => sum + t.testCount, 0),
|
|
109
|
+
estimatedCoverage,
|
|
110
|
+
generationTime: Date.now() - this.startTime,
|
|
111
|
+
outputFile
|
|
112
|
+
};
|
|
113
|
+
yield this.progressEvent(100, `Generated ${result.totalTests} tests in ${outputFile}`);
|
|
114
|
+
yield this.resultEvent(result, { type: 'final' });
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Validate source file exists and is readable
|
|
118
|
+
*/
|
|
119
|
+
async validateSourceFile(sourceFile) {
|
|
120
|
+
try {
|
|
121
|
+
await fs.access(sourceFile, fs.constants.R_OK);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
throw new Error(`Source file not found or not readable: ${sourceFile}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Analyze source file to extract functions
|
|
129
|
+
*/
|
|
130
|
+
async analyzeSourceFile(sourceFile) {
|
|
131
|
+
const code = await fs.readFile(sourceFile, 'utf-8');
|
|
132
|
+
const functions = [];
|
|
133
|
+
try {
|
|
134
|
+
const ast = (0, parser_1.parse)(code, {
|
|
135
|
+
sourceType: 'module',
|
|
136
|
+
plugins: ['typescript', 'jsx']
|
|
137
|
+
});
|
|
138
|
+
// Use @babel/traverse default export
|
|
139
|
+
const traverseFunc = typeof traverse_1.default === 'function' ? traverse_1.default : traverse_1.default.default;
|
|
140
|
+
traverseFunc(ast, {
|
|
141
|
+
FunctionDeclaration(path) {
|
|
142
|
+
functions.push(this.extractFunctionInfo(path));
|
|
143
|
+
},
|
|
144
|
+
ArrowFunctionExpression(path) {
|
|
145
|
+
if (path.parent.type === 'VariableDeclarator') {
|
|
146
|
+
functions.push(this.extractFunctionInfo(path));
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
ClassMethod(path) {
|
|
150
|
+
functions.push(this.extractFunctionInfo(path));
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return {
|
|
154
|
+
functions,
|
|
155
|
+
totalLines: code.split('\n').length
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
// If parsing fails, return empty analysis
|
|
160
|
+
return {
|
|
161
|
+
functions: [],
|
|
162
|
+
totalLines: code.split('\n').length
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Extract function information from AST node
|
|
168
|
+
*/
|
|
169
|
+
extractFunctionInfo(path) {
|
|
170
|
+
const node = path.node;
|
|
171
|
+
const name = node.id?.name || node.key?.name || 'anonymous';
|
|
172
|
+
return {
|
|
173
|
+
name,
|
|
174
|
+
params: node.params?.map((p) => p.name || 'param') || [],
|
|
175
|
+
complexity: this.estimateComplexity(node),
|
|
176
|
+
isAsync: node.async || false,
|
|
177
|
+
isExported: this.isExported(path),
|
|
178
|
+
lineStart: node.loc?.start.line || 0,
|
|
179
|
+
lineEnd: node.loc?.end.line || 0
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Estimate cyclomatic complexity
|
|
184
|
+
*/
|
|
185
|
+
estimateComplexity(node) {
|
|
186
|
+
// Simplified complexity estimation
|
|
187
|
+
let complexity = 1;
|
|
188
|
+
if (node.body) {
|
|
189
|
+
const bodyStr = JSON.stringify(node.body);
|
|
190
|
+
complexity += (bodyStr.match(/if|while|for|case|\&\&|\|\|/g) || []).length;
|
|
191
|
+
}
|
|
192
|
+
return complexity;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check if function is exported
|
|
196
|
+
*/
|
|
197
|
+
isExported(path) {
|
|
198
|
+
let parent = path.parentPath;
|
|
199
|
+
while (parent) {
|
|
200
|
+
if (parent.node.type === 'ExportNamedDeclaration' ||
|
|
201
|
+
parent.node.type === 'ExportDefaultDeclaration') {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
parent = parent.parentPath;
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Generate test for a single function
|
|
210
|
+
*/
|
|
211
|
+
async generateTestForFunction(func, framework, options) {
|
|
212
|
+
// In real implementation, this would use LLM to generate tests
|
|
213
|
+
// For now, generate template-based tests
|
|
214
|
+
const tests = [];
|
|
215
|
+
// Basic happy path test
|
|
216
|
+
tests.push(this.generateHappyPathTest(func, framework));
|
|
217
|
+
// Edge cases based on complexity
|
|
218
|
+
if (options.includeEdgeCases) {
|
|
219
|
+
tests.push(...this.generateEdgeCaseTests(func, framework));
|
|
220
|
+
}
|
|
221
|
+
// Error handling tests
|
|
222
|
+
if (func.complexity > 2) {
|
|
223
|
+
tests.push(this.generateErrorTest(func, framework));
|
|
224
|
+
}
|
|
225
|
+
const testCode = tests.join('\n\n');
|
|
226
|
+
return {
|
|
227
|
+
functionName: func.name,
|
|
228
|
+
testCode,
|
|
229
|
+
testCount: tests.length,
|
|
230
|
+
coverageEstimate: Math.min(95, 50 + (tests.length * 15)),
|
|
231
|
+
includesEdgeCases: options.includeEdgeCases,
|
|
232
|
+
includesMocks: options.generateMocks
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Generate happy path test
|
|
237
|
+
*/
|
|
238
|
+
generateHappyPathTest(func, framework) {
|
|
239
|
+
const testFn = framework === 'jest' ? 'test' : 'it';
|
|
240
|
+
const expectFn = framework === 'mocha' ? 'expect' : 'expect';
|
|
241
|
+
return `${testFn}('${func.name} should work with valid input', ${func.isAsync ? 'async ' : ''}() => {
|
|
242
|
+
// Arrange
|
|
243
|
+
const input = {}; // TODO: Provide valid input
|
|
244
|
+
|
|
245
|
+
// Act
|
|
246
|
+
const result = ${func.isAsync ? 'await ' : ''}${func.name}(input);
|
|
247
|
+
|
|
248
|
+
// Assert
|
|
249
|
+
${expectFn}(result).toBeDefined();
|
|
250
|
+
});`;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Generate edge case tests
|
|
254
|
+
*/
|
|
255
|
+
generateEdgeCaseTests(func, framework) {
|
|
256
|
+
const testFn = framework === 'jest' ? 'test' : 'it';
|
|
257
|
+
const tests = [];
|
|
258
|
+
// Null/undefined test
|
|
259
|
+
tests.push(`${testFn}('${func.name} should handle null/undefined', () => {
|
|
260
|
+
expect(() => ${func.name}(null)).not.toThrow();
|
|
261
|
+
});`);
|
|
262
|
+
// Empty input test
|
|
263
|
+
if (func.params.length > 0) {
|
|
264
|
+
tests.push(`${testFn}('${func.name} should handle empty input', () => {
|
|
265
|
+
const result = ${func.name}({});
|
|
266
|
+
expect(result).toBeDefined();
|
|
267
|
+
});`);
|
|
268
|
+
}
|
|
269
|
+
return tests;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Generate error handling test
|
|
273
|
+
*/
|
|
274
|
+
generateErrorTest(func, framework) {
|
|
275
|
+
const testFn = framework === 'jest' ? 'test' : 'it';
|
|
276
|
+
return `${testFn}('${func.name} should handle errors gracefully', ${func.isAsync ? 'async ' : ''}() => {
|
|
277
|
+
const invalidInput = undefined;
|
|
278
|
+
|
|
279
|
+
${func.isAsync ?
|
|
280
|
+
'await expect(' + func.name + '(invalidInput)).rejects.toThrow();' :
|
|
281
|
+
'expect(() => ' + func.name + '(invalidInput)).toThrow();'}
|
|
282
|
+
});`;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Generate test file with all tests
|
|
286
|
+
*/
|
|
287
|
+
async generateTestFile(sourceFile, tests, framework) {
|
|
288
|
+
const dir = path.dirname(sourceFile);
|
|
289
|
+
const basename = path.basename(sourceFile, path.extname(sourceFile));
|
|
290
|
+
const outputFile = path.join(dir, `${basename}.test.ts`);
|
|
291
|
+
const imports = this.generateImports(sourceFile, tests, framework);
|
|
292
|
+
const testSuites = tests.map(t => t.testCode).join('\n\n');
|
|
293
|
+
const fileContent = `${imports}\n\ndescribe('${basename}', () => {\n${testSuites}\n});\n`;
|
|
294
|
+
await fs.writeFile(outputFile, fileContent, 'utf-8');
|
|
295
|
+
return outputFile;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Generate import statements
|
|
299
|
+
*/
|
|
300
|
+
generateImports(sourceFile, tests, framework) {
|
|
301
|
+
const functionNames = tests.map(t => t.functionName).join(', ');
|
|
302
|
+
const relativePath = './' + path.basename(sourceFile, path.extname(sourceFile));
|
|
303
|
+
let imports = `import { ${functionNames} } from '${relativePath}';\n`;
|
|
304
|
+
if (framework === 'jest') {
|
|
305
|
+
imports += `import { describe, test, expect } from '@jest/globals';\n`;
|
|
306
|
+
}
|
|
307
|
+
else if (framework === 'mocha') {
|
|
308
|
+
imports += `import { describe, it } from 'mocha';\nimport { expect } from 'chai';\n`;
|
|
309
|
+
}
|
|
310
|
+
return imports;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Calculate estimated coverage
|
|
314
|
+
*/
|
|
315
|
+
calculateCoverageEstimate(tests, totalLines) {
|
|
316
|
+
const avgCoverage = tests.reduce((sum, t) => sum + t.coverageEstimate, 0) / tests.length;
|
|
317
|
+
return Math.min(95, avgCoverage);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
exports.TestGenerateStreamHandler = TestGenerateStreamHandler;
|
|
321
|
+
//# sourceMappingURL=TestGenerateStreamHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestGenerateStreamHandler.js","sourceRoot":"","sources":["../../src/streaming/TestGenerateStreamHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming API Module
|
|
3
|
+
*
|
|
4
|
+
* Provides AsyncGenerator-based streaming handlers for real-time progress updates.
|
|
5
|
+
* All handlers support for-await-of pattern for incremental result processing.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @author Agentic QE Team
|
|
9
|
+
*/
|
|
10
|
+
export { BaseStreamHandler, StreamEvent } from './BaseStreamHandler';
|
|
11
|
+
export { TestGenerateStreamHandler, TestGenerateParams, TestGenerateResult } from './TestGenerateStreamHandler';
|
|
12
|
+
export { TestExecuteStreamHandler } from '../mcp/streaming/TestExecuteStreamHandler';
|
|
13
|
+
export { CoverageAnalyzeStreamHandler } from '../mcp/streaming/CoverageAnalyzeStreamHandler';
|
|
14
|
+
export { StreamingMCPTool } from '../mcp/streaming/StreamingMCPTool';
|
|
15
|
+
export * from '../mcp/streaming/types';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGhH,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Streaming API Module
|
|
4
|
+
*
|
|
5
|
+
* Provides AsyncGenerator-based streaming handlers for real-time progress updates.
|
|
6
|
+
* All handlers support for-await-of pattern for incremental result processing.
|
|
7
|
+
*
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
* @author Agentic QE Team
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
23
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.StreamingMCPTool = exports.CoverageAnalyzeStreamHandler = exports.TestExecuteStreamHandler = exports.TestGenerateStreamHandler = exports.BaseStreamHandler = void 0;
|
|
27
|
+
var BaseStreamHandler_1 = require("./BaseStreamHandler");
|
|
28
|
+
Object.defineProperty(exports, "BaseStreamHandler", { enumerable: true, get: function () { return BaseStreamHandler_1.BaseStreamHandler; } });
|
|
29
|
+
var TestGenerateStreamHandler_1 = require("./TestGenerateStreamHandler");
|
|
30
|
+
Object.defineProperty(exports, "TestGenerateStreamHandler", { enumerable: true, get: function () { return TestGenerateStreamHandler_1.TestGenerateStreamHandler; } });
|
|
31
|
+
// Re-export MCP streaming handlers
|
|
32
|
+
var TestExecuteStreamHandler_1 = require("../mcp/streaming/TestExecuteStreamHandler");
|
|
33
|
+
Object.defineProperty(exports, "TestExecuteStreamHandler", { enumerable: true, get: function () { return TestExecuteStreamHandler_1.TestExecuteStreamHandler; } });
|
|
34
|
+
var CoverageAnalyzeStreamHandler_1 = require("../mcp/streaming/CoverageAnalyzeStreamHandler");
|
|
35
|
+
Object.defineProperty(exports, "CoverageAnalyzeStreamHandler", { enumerable: true, get: function () { return CoverageAnalyzeStreamHandler_1.CoverageAnalyzeStreamHandler; } });
|
|
36
|
+
var StreamingMCPTool_1 = require("../mcp/streaming/StreamingMCPTool");
|
|
37
|
+
Object.defineProperty(exports, "StreamingMCPTool", { enumerable: true, get: function () { return StreamingMCPTool_1.StreamingMCPTool; } });
|
|
38
|
+
__exportStar(require("../mcp/streaming/types"), exports);
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;AAEH,yDAAqE;AAA5D,sHAAA,iBAAiB,OAAA;AAC1B,yEAAgH;AAAvG,sIAAA,yBAAyB,OAAA;AAElC,mCAAmC;AACnC,sFAAqF;AAA5E,oIAAA,wBAAwB,OAAA;AACjC,8FAA6F;AAApF,4IAAA,4BAA4B,OAAA;AACrC,sEAAqE;AAA5D,oHAAA,gBAAgB,OAAA;AACzB,yDAAuC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Logger for Testing
|
|
3
|
+
*
|
|
4
|
+
* This is a Jest manual mock that automatically replaces the real Logger
|
|
5
|
+
* when jest.mock('@utils/Logger') is called in tests.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum LogLevel {
|
|
8
|
+
ERROR = "error",
|
|
9
|
+
WARN = "warn",
|
|
10
|
+
INFO = "info",
|
|
11
|
+
DEBUG = "debug"
|
|
12
|
+
}
|
|
13
|
+
export declare class Logger {
|
|
14
|
+
private static mockInstance;
|
|
15
|
+
static getInstance(): Logger;
|
|
16
|
+
static resetInstance(): void;
|
|
17
|
+
info: jest.Mock<any, any, any>;
|
|
18
|
+
warn: jest.Mock<any, any, any>;
|
|
19
|
+
error: jest.Mock<any, any, any>;
|
|
20
|
+
debug: jest.Mock<any, any, any>;
|
|
21
|
+
log: jest.Mock<any, any, any>;
|
|
22
|
+
setLevel: jest.Mock<any, any, any>;
|
|
23
|
+
getLevel: jest.Mock<any, any, any>;
|
|
24
|
+
child: jest.Mock<any, [], any>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=Logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../../src/utils/__mocks__/Logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAY,QAAQ;IAClB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAuB;IAElD,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B,IAAI,2BAAa;IACjB,IAAI,2BAAa;IACjB,KAAK,2BAAa;IAClB,KAAK,2BAAa;IAClB,GAAG,2BAAa;IAChB,QAAQ,2BAAa;IACrB,QAAQ,2BAAqC;IAC7C,KAAK,0BAEF;CACJ"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Mock Logger for Testing
|
|
4
|
+
*
|
|
5
|
+
* This is a Jest manual mock that automatically replaces the real Logger
|
|
6
|
+
* when jest.mock('@utils/Logger') is called in tests.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.Logger = exports.LogLevel = void 0;
|
|
10
|
+
var LogLevel;
|
|
11
|
+
(function (LogLevel) {
|
|
12
|
+
LogLevel["ERROR"] = "error";
|
|
13
|
+
LogLevel["WARN"] = "warn";
|
|
14
|
+
LogLevel["INFO"] = "info";
|
|
15
|
+
LogLevel["DEBUG"] = "debug";
|
|
16
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
17
|
+
class Logger {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.info = jest.fn();
|
|
20
|
+
this.warn = jest.fn();
|
|
21
|
+
this.error = jest.fn();
|
|
22
|
+
this.debug = jest.fn();
|
|
23
|
+
this.log = jest.fn();
|
|
24
|
+
this.setLevel = jest.fn();
|
|
25
|
+
this.getLevel = jest.fn().mockReturnValue('info');
|
|
26
|
+
this.child = jest.fn(function () {
|
|
27
|
+
return this;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
static getInstance() {
|
|
31
|
+
if (!Logger.mockInstance) {
|
|
32
|
+
Logger.mockInstance = new Logger();
|
|
33
|
+
}
|
|
34
|
+
return Logger.mockInstance;
|
|
35
|
+
}
|
|
36
|
+
static resetInstance() {
|
|
37
|
+
Logger.mockInstance = null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.Logger = Logger;
|
|
41
|
+
Logger.mockInstance = null;
|
|
42
|
+
//# sourceMappingURL=Logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../../src/utils/__mocks__/Logger.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,2BAAe,CAAA;IACf,yBAAa,CAAA;IACb,yBAAa,CAAA;IACb,2BAAe,CAAA;AACjB,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAED,MAAa,MAAM;IAAnB;QAcE,SAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACjB,SAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACjB,UAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAClB,UAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAClB,QAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAChB,aAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACrB,aAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,UAAK,GAAG,IAAI,CAAC,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IArBC,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,CAAC,YAAY,GAAG,IAAI,MAAM,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,MAAM,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;IAC7B,CAAC;;AAZH,wBAwBC;AAvBgB,mBAAY,GAAkB,IAAI,AAAtB,CAAuB"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-qe",
|
|
3
|
-
"version": "1.3.
|
|
4
|
-
"description": "Agentic Quality Engineering Fleet System - AI-driven quality management platform with learning, pattern reuse, ML-based flaky detection, Multi-Model Router (70-81% cost savings), streaming progress updates, and native TypeScript hooks",
|
|
3
|
+
"version": "1.3.4",
|
|
4
|
+
"description": "Agentic Quality Engineering Fleet System - AI-driven quality management platform with 34 QE skills, learning, pattern reuse, ML-based flaky detection, Multi-Model Router (70-81% cost savings), streaming progress updates, 61 MCP tools, and native TypeScript hooks",
|
|
5
5
|
"main": "dist/cli/index.js",
|
|
6
6
|
"types": "dist/cli/index.d.ts",
|
|
7
7
|
"bin": {
|
|
@@ -43,6 +43,9 @@
|
|
|
43
43
|
"test:mcp": "node --expose-gc --max-old-space-size=512 --no-compilation-cache node_modules/.bin/jest tests/mcp --runInBand",
|
|
44
44
|
"test:cli": "node --expose-gc --max-old-space-size=512 --no-compilation-cache node_modules/.bin/jest tests/cli --runInBand",
|
|
45
45
|
"test:utils": "node --expose-gc --max-old-space-size=768 --no-compilation-cache node_modules/.bin/jest tests/utils --runInBand",
|
|
46
|
+
"test:streaming": "node --expose-gc --max-old-space-size=512 --no-compilation-cache node_modules/.bin/jest tests/streaming --runInBand",
|
|
47
|
+
"test:agentdb": "node --expose-gc --max-old-space-size=1024 --no-compilation-cache node_modules/.bin/jest tests/agentdb --runInBand",
|
|
48
|
+
"test:benchmark": "node --expose-gc --max-old-space-size=2048 --no-compilation-cache node_modules/.bin/jest tests/agentdb/performance-benchmark.test.ts --runInBand --forceExit",
|
|
46
49
|
"pretest:integration:phase2": "node scripts/check-memory-before-test.js",
|
|
47
50
|
"test:integration:phase2": "node --expose-gc --max-old-space-size=1024 --no-compilation-cache node_modules/.bin/jest tests/integration/phase2 --runInBand --forceExit",
|
|
48
51
|
"pretest:integration:phase2:agents": "node scripts/check-memory-before-test.js",
|
|
@@ -70,7 +73,12 @@
|
|
|
70
73
|
"docs:serve": "npx http-server docs/api -p 8080",
|
|
71
74
|
"orchestrator": "ts-node scripts/final-go-orchestrator.ts",
|
|
72
75
|
"orchestrator:test": "ts-node scripts/test-orchestrator.ts",
|
|
73
|
-
"query-memory": "ts-node scripts/query-aqe-memory-single.ts"
|
|
76
|
+
"query-memory": "ts-node scripts/query-aqe-memory-single.ts",
|
|
77
|
+
"verify:counts": "tsx scripts/verify-counts.ts",
|
|
78
|
+
"verify:agent-skills": "tsx scripts/verify-agent-skills.ts",
|
|
79
|
+
"verify:features": "tsx scripts/verify-features.ts",
|
|
80
|
+
"verify:all": "npm run verify:counts && npm run verify:agent-skills && npm run verify:features",
|
|
81
|
+
"update:counts": "tsx scripts/update-documentation-counts.ts"
|
|
74
82
|
},
|
|
75
83
|
"keywords": [
|
|
76
84
|
"quality-engineering",
|
|
@@ -98,10 +106,13 @@
|
|
|
98
106
|
"dependencies": {
|
|
99
107
|
"@anthropic-ai/sdk": "^0.64.0",
|
|
100
108
|
"@babel/parser": "^7.24.0",
|
|
109
|
+
"@babel/traverse": "^7.24.0",
|
|
101
110
|
"@faker-js/faker": "^10.0.0",
|
|
102
111
|
"@modelcontextprotocol/sdk": "^1.18.2",
|
|
103
112
|
"@xenova/transformers": "^2.6.0",
|
|
113
|
+
"agentdb": "^1.0.0",
|
|
104
114
|
"agentic-flow": "^1.7.3",
|
|
115
|
+
"agentic-qe": "^1.3.3",
|
|
105
116
|
"ajv": "^8.17.1",
|
|
106
117
|
"ajv-formats": "^3.0.1",
|
|
107
118
|
"better-sqlite3": "^12.4.1",
|
|
@@ -154,6 +165,7 @@
|
|
|
154
165
|
"stack-utils": "^2.0.6",
|
|
155
166
|
"ts-jest": "^29.4.4",
|
|
156
167
|
"ts-node": "^10.9.1",
|
|
168
|
+
"tsx": "^4.20.6",
|
|
157
169
|
"typedoc": "^0.28.13",
|
|
158
170
|
"typescript": "^5.9.3",
|
|
159
171
|
"uuid": "^11.0.5",
|