@yasserkhanorg/e2e-agents 0.3.2
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/LICENSE +168 -0
- package/README.md +620 -0
- package/dist/agent/analysis.d.ts +62 -0
- package/dist/agent/analysis.d.ts.map +1 -0
- package/dist/agent/analysis.js +292 -0
- package/dist/agent/blast_radius.d.ts +4 -0
- package/dist/agent/blast_radius.d.ts.map +1 -0
- package/dist/agent/blast_radius.js +37 -0
- package/dist/agent/cache_utils.d.ts +38 -0
- package/dist/agent/cache_utils.d.ts.map +1 -0
- package/dist/agent/cache_utils.js +67 -0
- package/dist/agent/config.d.ts +148 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +640 -0
- package/dist/agent/dependency_graph.d.ts +14 -0
- package/dist/agent/dependency_graph.d.ts.map +1 -0
- package/dist/agent/dependency_graph.js +227 -0
- package/dist/agent/feedback.d.ts +55 -0
- package/dist/agent/feedback.d.ts.map +1 -0
- package/dist/agent/feedback.js +257 -0
- package/dist/agent/flags.d.ts +23 -0
- package/dist/agent/flags.d.ts.map +1 -0
- package/dist/agent/flags.js +171 -0
- package/dist/agent/flow_catalog.d.ts +25 -0
- package/dist/agent/flow_catalog.d.ts.map +1 -0
- package/dist/agent/flow_catalog.js +106 -0
- package/dist/agent/flow_mapping.d.ts +10 -0
- package/dist/agent/flow_mapping.d.ts.map +1 -0
- package/dist/agent/flow_mapping.js +84 -0
- package/dist/agent/framework.d.ts +13 -0
- package/dist/agent/framework.d.ts.map +1 -0
- package/dist/agent/framework.js +149 -0
- package/dist/agent/gap_suggestions.d.ts +14 -0
- package/dist/agent/gap_suggestions.d.ts.map +1 -0
- package/dist/agent/gap_suggestions.js +101 -0
- package/dist/agent/generator.d.ts +10 -0
- package/dist/agent/generator.d.ts.map +1 -0
- package/dist/agent/generator.js +115 -0
- package/dist/agent/git.d.ts +11 -0
- package/dist/agent/git.d.ts.map +1 -0
- package/dist/agent/git.js +90 -0
- package/dist/agent/handoff.d.ts +22 -0
- package/dist/agent/handoff.d.ts.map +1 -0
- package/dist/agent/handoff.js +180 -0
- package/dist/agent/impact-analyzer.d.ts +114 -0
- package/dist/agent/impact-analyzer.d.ts.map +1 -0
- package/dist/agent/impact-analyzer.js +557 -0
- package/dist/agent/index.d.ts +21 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +38 -0
- package/dist/agent/model-router.d.ts +57 -0
- package/dist/agent/model-router.d.ts.map +1 -0
- package/dist/agent/model-router.js +154 -0
- package/dist/agent/operational_insights.d.ts +41 -0
- package/dist/agent/operational_insights.d.ts.map +1 -0
- package/dist/agent/operational_insights.js +126 -0
- package/dist/agent/pipeline.d.ts +23 -0
- package/dist/agent/pipeline.d.ts.map +1 -0
- package/dist/agent/pipeline.js +609 -0
- package/dist/agent/plan.d.ts +91 -0
- package/dist/agent/plan.d.ts.map +1 -0
- package/dist/agent/plan.js +331 -0
- package/dist/agent/playwright_report.d.ts +8 -0
- package/dist/agent/playwright_report.d.ts.map +1 -0
- package/dist/agent/playwright_report.js +126 -0
- package/dist/agent/report-generator.d.ts +24 -0
- package/dist/agent/report-generator.d.ts.map +1 -0
- package/dist/agent/report-generator.js +250 -0
- package/dist/agent/report.d.ts +81 -0
- package/dist/agent/report.d.ts.map +1 -0
- package/dist/agent/report.js +147 -0
- package/dist/agent/runner.d.ts +7 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +576 -0
- package/dist/agent/selectors.d.ts +10 -0
- package/dist/agent/selectors.d.ts.map +1 -0
- package/dist/agent/selectors.js +75 -0
- package/dist/agent/spec-bridge.d.ts +101 -0
- package/dist/agent/spec-bridge.d.ts.map +1 -0
- package/dist/agent/spec-bridge.js +273 -0
- package/dist/agent/spec-builder.d.ts +102 -0
- package/dist/agent/spec-builder.d.ts.map +1 -0
- package/dist/agent/spec-builder.js +273 -0
- package/dist/agent/subsystem_risk.d.ts +23 -0
- package/dist/agent/subsystem_risk.d.ts.map +1 -0
- package/dist/agent/subsystem_risk.js +207 -0
- package/dist/agent/telemetry.d.ts +84 -0
- package/dist/agent/telemetry.d.ts.map +1 -0
- package/dist/agent/telemetry.js +220 -0
- package/dist/agent/test_path.d.ts +2 -0
- package/dist/agent/test_path.d.ts.map +1 -0
- package/dist/agent/test_path.js +23 -0
- package/dist/agent/tests.d.ts +18 -0
- package/dist/agent/tests.d.ts.map +1 -0
- package/dist/agent/tests.js +106 -0
- package/dist/agent/traceability.d.ts +22 -0
- package/dist/agent/traceability.d.ts.map +1 -0
- package/dist/agent/traceability.js +183 -0
- package/dist/agent/traceability_capture.d.ts +18 -0
- package/dist/agent/traceability_capture.d.ts.map +1 -0
- package/dist/agent/traceability_capture.js +313 -0
- package/dist/agent/traceability_ingest.d.ts +21 -0
- package/dist/agent/traceability_ingest.d.ts.map +1 -0
- package/dist/agent/traceability_ingest.js +237 -0
- package/dist/agent/utils.d.ts +13 -0
- package/dist/agent/utils.d.ts.map +1 -0
- package/dist/agent/utils.js +152 -0
- package/dist/agent/validators/selector-validator.d.ts +74 -0
- package/dist/agent/validators/selector-validator.d.ts.map +1 -0
- package/dist/agent/validators/selector-validator.js +165 -0
- package/dist/anthropic_provider.d.ts +65 -0
- package/dist/anthropic_provider.d.ts.map +1 -0
- package/dist/anthropic_provider.js +332 -0
- package/dist/api.d.ts +48 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +113 -0
- package/dist/base_provider.d.ts +53 -0
- package/dist/base_provider.d.ts.map +1 -0
- package/dist/base_provider.js +81 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +843 -0
- package/dist/custom_provider.d.ts +20 -0
- package/dist/custom_provider.d.ts.map +1 -0
- package/dist/custom_provider.js +276 -0
- package/dist/e2e-test-gen/index.d.ts +51 -0
- package/dist/e2e-test-gen/index.d.ts.map +1 -0
- package/dist/e2e-test-gen/index.js +57 -0
- package/dist/e2e-test-gen/spec_parser.d.ts +142 -0
- package/dist/e2e-test-gen/spec_parser.d.ts.map +1 -0
- package/dist/e2e-test-gen/spec_parser.js +786 -0
- package/dist/e2e-test-gen/types.d.ts +185 -0
- package/dist/e2e-test-gen/types.d.ts.map +1 -0
- package/dist/e2e-test-gen/types.js +4 -0
- package/dist/esm/agent/analysis.js +287 -0
- package/dist/esm/agent/blast_radius.js +34 -0
- package/dist/esm/agent/cache_utils.js +63 -0
- package/dist/esm/agent/config.js +637 -0
- package/dist/esm/agent/dependency_graph.js +224 -0
- package/dist/esm/agent/feedback.js +253 -0
- package/dist/esm/agent/flags.js +160 -0
- package/dist/esm/agent/flow_catalog.js +103 -0
- package/dist/esm/agent/flow_mapping.js +81 -0
- package/dist/esm/agent/framework.js +145 -0
- package/dist/esm/agent/gap_suggestions.js +98 -0
- package/dist/esm/agent/generator.js +112 -0
- package/dist/esm/agent/git.js +87 -0
- package/dist/esm/agent/handoff.js +177 -0
- package/dist/esm/agent/impact-analyzer.js +548 -0
- package/dist/esm/agent/index.js +22 -0
- package/dist/esm/agent/model-router.js +150 -0
- package/dist/esm/agent/operational_insights.js +123 -0
- package/dist/esm/agent/pipeline.js +605 -0
- package/dist/esm/agent/plan.js +324 -0
- package/dist/esm/agent/playwright_report.js +123 -0
- package/dist/esm/agent/report-generator.js +247 -0
- package/dist/esm/agent/report.js +144 -0
- package/dist/esm/agent/runner.js +572 -0
- package/dist/esm/agent/selectors.js +71 -0
- package/dist/esm/agent/spec-bridge.js +267 -0
- package/dist/esm/agent/spec-builder.js +267 -0
- package/dist/esm/agent/subsystem_risk.js +204 -0
- package/dist/esm/agent/telemetry.js +216 -0
- package/dist/esm/agent/test_path.js +20 -0
- package/dist/esm/agent/tests.js +101 -0
- package/dist/esm/agent/traceability.js +180 -0
- package/dist/esm/agent/traceability_capture.js +310 -0
- package/dist/esm/agent/traceability_ingest.js +234 -0
- package/dist/esm/agent/utils.js +138 -0
- package/dist/esm/agent/validators/selector-validator.js +160 -0
- package/dist/esm/anthropic_provider.js +324 -0
- package/dist/esm/api.js +105 -0
- package/dist/esm/base_provider.js +77 -0
- package/dist/esm/cli.js +841 -0
- package/dist/esm/custom_provider.js +272 -0
- package/dist/esm/e2e-test-gen/index.js +50 -0
- package/dist/esm/e2e-test-gen/spec_parser.js +782 -0
- package/dist/esm/e2e-test-gen/types.js +3 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/logger.js +89 -0
- package/dist/esm/mcp-server.js +465 -0
- package/dist/esm/ollama_provider.js +300 -0
- package/dist/esm/openai_provider.js +242 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/plan-and-test-constants.js +126 -0
- package/dist/esm/provider_factory.js +336 -0
- package/dist/esm/provider_interface.js +23 -0
- package/dist/esm/provider_utils.js +96 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/logger.d.ts +23 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +93 -0
- package/dist/mcp-server.d.ts +35 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +469 -0
- package/dist/ollama_provider.d.ts +65 -0
- package/dist/ollama_provider.d.ts.map +1 -0
- package/dist/ollama_provider.js +308 -0
- package/dist/openai_provider.d.ts +23 -0
- package/dist/openai_provider.d.ts.map +1 -0
- package/dist/openai_provider.js +250 -0
- package/dist/plan-and-test-constants.d.ts +110 -0
- package/dist/plan-and-test-constants.d.ts.map +1 -0
- package/dist/plan-and-test-constants.js +132 -0
- package/dist/provider_factory.d.ts +99 -0
- package/dist/provider_factory.d.ts.map +1 -0
- package/dist/provider_factory.js +341 -0
- package/dist/provider_interface.d.ts +358 -0
- package/dist/provider_interface.d.ts.map +1 -0
- package/dist/provider_interface.js +28 -0
- package/dist/provider_utils.d.ts +39 -0
- package/dist/provider_utils.d.ts.map +1 -0
- package/dist/provider_utils.js +103 -0
- package/package.json +101 -0
- package/schemas/gap.schema.json +18 -0
- package/schemas/impact.schema.json +418 -0
- package/schemas/plan.schema.json +285 -0
- package/schemas/subsystem-risk-map.schema.json +62 -0
- package/schemas/traceability-input.schema.json +122 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/agent/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
3
|
+
// See LICENSE.txt for license information.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.buildPlanFromImpactReport = buildPlanFromImpactReport;
|
|
6
|
+
exports.attachDeveloperActions = attachDeveloperActions;
|
|
7
|
+
exports.writePlanReport = writePlanReport;
|
|
8
|
+
exports.renderCiSummaryMarkdown = renderCiSummaryMarkdown;
|
|
9
|
+
exports.writeCiSummary = writeCiSummary;
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
const path_1 = require("path");
|
|
12
|
+
const minimatch_1 = require("minimatch");
|
|
13
|
+
const DEFAULT_POLICY = {
|
|
14
|
+
minConfidenceForTargeted: 60,
|
|
15
|
+
safeMergeMinConfidence: 85,
|
|
16
|
+
forceFullOnWarningsAtOrAbove: 2,
|
|
17
|
+
forceFullOnP0WithGaps: true,
|
|
18
|
+
forceFullOnRiskyFiles: true,
|
|
19
|
+
riskyFilePatterns: [
|
|
20
|
+
'**/auth/**',
|
|
21
|
+
'**/login/**',
|
|
22
|
+
'**/permissions/**',
|
|
23
|
+
'**/admin/**',
|
|
24
|
+
'**/security/**',
|
|
25
|
+
'**/migrations/**',
|
|
26
|
+
'**/schema/**',
|
|
27
|
+
'**/*.sql',
|
|
28
|
+
'**/webhook/**',
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
function countPriority(flows) {
|
|
32
|
+
const counts = { p0: 0, p1: 0, p2: 0 };
|
|
33
|
+
for (const flow of flows) {
|
|
34
|
+
if (flow.priority === 'P0')
|
|
35
|
+
counts.p0 += 1;
|
|
36
|
+
else if (flow.priority === 'P1')
|
|
37
|
+
counts.p1 += 1;
|
|
38
|
+
else
|
|
39
|
+
counts.p2 += 1;
|
|
40
|
+
}
|
|
41
|
+
return counts;
|
|
42
|
+
}
|
|
43
|
+
function computeConfidence(impact, p0, p1) {
|
|
44
|
+
let confidence = 85;
|
|
45
|
+
confidence -= Math.min(25, impact.warnings.length * 8);
|
|
46
|
+
confidence -= Math.min(20, impact.gaps.length * 5);
|
|
47
|
+
if (p0 > 0) {
|
|
48
|
+
confidence -= Math.min(10, p0 * 3);
|
|
49
|
+
}
|
|
50
|
+
else if (p1 > 0) {
|
|
51
|
+
confidence -= Math.min(6, p1 * 2);
|
|
52
|
+
}
|
|
53
|
+
if (impact.impactModel) {
|
|
54
|
+
if (impact.impactModel.flowMapping === 'catalog') {
|
|
55
|
+
confidence += 4;
|
|
56
|
+
}
|
|
57
|
+
if (impact.impactModel.testMapping === 'catalog') {
|
|
58
|
+
confidence += 4;
|
|
59
|
+
}
|
|
60
|
+
else if (impact.impactModel.testMapping === 'traceability') {
|
|
61
|
+
confidence += 6;
|
|
62
|
+
}
|
|
63
|
+
if (impact.impactModel.confidenceClass === 'medium') {
|
|
64
|
+
confidence -= 4;
|
|
65
|
+
}
|
|
66
|
+
else if (impact.impactModel.confidenceClass === 'low') {
|
|
67
|
+
confidence -= 12;
|
|
68
|
+
}
|
|
69
|
+
if (impact.impactModel.traceability) {
|
|
70
|
+
if (!impact.impactModel.traceability.manifestFound) {
|
|
71
|
+
confidence -= 6;
|
|
72
|
+
}
|
|
73
|
+
else if (impact.impactModel.traceability.coverageRatio >= 0.8) {
|
|
74
|
+
confidence += 2;
|
|
75
|
+
}
|
|
76
|
+
else if (impact.impactModel.traceability.coverageRatio < 0.5) {
|
|
77
|
+
confidence -= 4;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (impact.impactModel.dependencyGraph?.truncated) {
|
|
81
|
+
confidence -= 6;
|
|
82
|
+
}
|
|
83
|
+
if (impact.impactModel.dependencyGraph && impact.impactModel.dependencyGraph.expandedFiles > 0) {
|
|
84
|
+
confidence += 2;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return Math.max(0, Math.min(100, confidence));
|
|
88
|
+
}
|
|
89
|
+
function findRiskyFiles(changedFiles, patterns) {
|
|
90
|
+
const risky = changedFiles.filter((file) => patterns.some((pattern) => (0, minimatch_1.minimatch)(file, pattern, { matchBase: true })));
|
|
91
|
+
return [...new Set(risky)];
|
|
92
|
+
}
|
|
93
|
+
function pickRunSet(impact, p0, confidence, policy) {
|
|
94
|
+
const reasons = [];
|
|
95
|
+
const triggeredRules = [];
|
|
96
|
+
const riskyFiles = findRiskyFiles(impact.changedFiles, policy.riskyFilePatterns);
|
|
97
|
+
if (impact.warnings.length > 0) {
|
|
98
|
+
reasons.push('Impact analysis emitted warnings; broader safety coverage is recommended.');
|
|
99
|
+
}
|
|
100
|
+
if (impact.gaps.length > 0) {
|
|
101
|
+
reasons.push('Uncovered P0/P1 flows were detected.');
|
|
102
|
+
}
|
|
103
|
+
if (p0 > 0) {
|
|
104
|
+
reasons.push('P0 flows are impacted by this change set.');
|
|
105
|
+
}
|
|
106
|
+
if (policy.forceFullOnRiskyFiles && riskyFiles.length > 0) {
|
|
107
|
+
triggeredRules.push('risky-files');
|
|
108
|
+
reasons.push(`Risky file patterns matched: ${riskyFiles.join(', ')}`);
|
|
109
|
+
}
|
|
110
|
+
if (impact.impactModel?.confidenceClass === 'low') {
|
|
111
|
+
triggeredRules.push('low-traceability');
|
|
112
|
+
reasons.push('Impact mapping confidence is low (heuristic traceability).');
|
|
113
|
+
}
|
|
114
|
+
if (impact.impactModel?.traceability?.manifestFound && impact.impactModel.traceability.coverageRatio < 0.4) {
|
|
115
|
+
triggeredRules.push('traceability-low-coverage');
|
|
116
|
+
reasons.push('Traceability manifest coverage is low for impacted flows; broader safety run is recommended.');
|
|
117
|
+
}
|
|
118
|
+
if (impact.impactModel?.dependencyGraph?.truncated) {
|
|
119
|
+
triggeredRules.push('dependency-graph-truncated');
|
|
120
|
+
reasons.push('Dependency graph expansion was truncated; broader safety run is recommended.');
|
|
121
|
+
}
|
|
122
|
+
if (confidence < policy.minConfidenceForTargeted) {
|
|
123
|
+
triggeredRules.push('low-confidence');
|
|
124
|
+
}
|
|
125
|
+
if (impact.warnings.length >= policy.forceFullOnWarningsAtOrAbove) {
|
|
126
|
+
triggeredRules.push('warning-threshold');
|
|
127
|
+
}
|
|
128
|
+
if (policy.forceFullOnP0WithGaps && p0 > 0 && impact.gaps.length > 0) {
|
|
129
|
+
triggeredRules.push('p0-with-gaps');
|
|
130
|
+
}
|
|
131
|
+
if (triggeredRules.length > 0) {
|
|
132
|
+
return {
|
|
133
|
+
runSet: 'full',
|
|
134
|
+
reasons: reasons.length > 0 ? reasons : ['Low confidence in targeted recommendation.'],
|
|
135
|
+
triggeredRules,
|
|
136
|
+
riskyFiles,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
if (impact.recommendedTests && impact.recommendedTests.length > 0) {
|
|
140
|
+
return {
|
|
141
|
+
runSet: 'targeted',
|
|
142
|
+
reasons: reasons.length > 0 ? reasons : ['Sufficient confidence for targeted run list.'],
|
|
143
|
+
triggeredRules,
|
|
144
|
+
riskyFiles,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
runSet: 'smoke',
|
|
149
|
+
reasons: reasons.length > 0 ? reasons : ['No targeted tests were mapped from the impacted flows.'],
|
|
150
|
+
triggeredRules,
|
|
151
|
+
riskyFiles,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function buildDecision(runSet, confidence, impact, policy) {
|
|
155
|
+
if (impact.gaps.length > 0) {
|
|
156
|
+
return {
|
|
157
|
+
action: 'must-add-tests',
|
|
158
|
+
title: 'Must add tests',
|
|
159
|
+
summary: `Detected ${impact.gaps.length} uncovered P0/P1 flow(s). Add or update tests before merge.`,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (runSet === 'smoke' && confidence >= policy.safeMergeMinConfidence && impact.warnings.length === 0) {
|
|
163
|
+
return {
|
|
164
|
+
action: 'safe-to-merge',
|
|
165
|
+
title: 'Safe to merge',
|
|
166
|
+
summary: 'No critical coverage gaps were detected and policy confidence is high.',
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
action: 'run-now',
|
|
171
|
+
title: 'Run now',
|
|
172
|
+
summary: `Execute the ${runSet} suite for this change set.`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function buildPlanFromImpactReport(impact, policyOverride) {
|
|
176
|
+
if (impact.mode !== 'impact') {
|
|
177
|
+
throw new Error(`Plan generation requires impact report data, received mode=${impact.mode}`);
|
|
178
|
+
}
|
|
179
|
+
const policy = { ...DEFAULT_POLICY, ...(policyOverride || {}) };
|
|
180
|
+
const { p0, p1, p2 } = countPriority(impact.flows);
|
|
181
|
+
const confidence = computeConfidence(impact, p0, p1);
|
|
182
|
+
const runSet = pickRunSet(impact, p0, confidence, policy);
|
|
183
|
+
const decision = buildDecision(runSet.runSet, confidence, impact, policy);
|
|
184
|
+
const requiredNewTests = impact.gaps.map((flow) => `${flow.id}: ${flow.name}`);
|
|
185
|
+
return {
|
|
186
|
+
schemaVersion: '1.0.0',
|
|
187
|
+
generatedAt: new Date().toISOString(),
|
|
188
|
+
source: 'impact',
|
|
189
|
+
runSet: runSet.runSet,
|
|
190
|
+
confidence,
|
|
191
|
+
reasons: runSet.reasons,
|
|
192
|
+
recommendedTests: impact.recommendedTests || [],
|
|
193
|
+
requiredNewTests,
|
|
194
|
+
policy: {
|
|
195
|
+
riskyFiles: runSet.riskyFiles,
|
|
196
|
+
triggeredRules: runSet.triggeredRules,
|
|
197
|
+
applied: policy,
|
|
198
|
+
},
|
|
199
|
+
decision,
|
|
200
|
+
metrics: {
|
|
201
|
+
changedFiles: impact.changedFiles.length,
|
|
202
|
+
impactedFlows: impact.flows.length,
|
|
203
|
+
p0Flows: p0,
|
|
204
|
+
p1Flows: p1,
|
|
205
|
+
p2Flows: p2,
|
|
206
|
+
uncoveredP0P1Flows: impact.gaps.length,
|
|
207
|
+
warnings: impact.warnings.length,
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function attachDeveloperActions(plan, context) {
|
|
212
|
+
const safeSince = context.sinceRef ? ` --since "${context.sinceRef}"` : '';
|
|
213
|
+
const runRecommendedTests = plan.recommendedTests.length > 0
|
|
214
|
+
? `node -e "const fs=require('fs'); const p=JSON.parse(fs.readFileSync('${context.testsRoot}/.e2e-ai-agents/plan.json','utf8')); const tests=p.recommendedTests.map((t)=>t.replace(/ \\(flags:.*\\)$/,'')); console.log(tests.join(' '));" | xargs npx playwright test`
|
|
215
|
+
: undefined;
|
|
216
|
+
return {
|
|
217
|
+
...plan,
|
|
218
|
+
nextActions: {
|
|
219
|
+
requiresUserApprovalForGeneration: true,
|
|
220
|
+
runRecommendedTests,
|
|
221
|
+
runSmokeSuite: 'npx playwright test --grep @smoke --project=chrome',
|
|
222
|
+
runFullSuite: 'npx playwright test --project=chrome',
|
|
223
|
+
approveAndGenerate: `npx e2e-ai-agents approve-and-generate --path "${context.appPath}" --tests-root "${context.testsRoot}" --pipeline --pipeline-mcp${safeSince}`,
|
|
224
|
+
generateMissingTests: `npx e2e-ai-agents approve-and-generate --path "${context.appPath}" --tests-root "${context.testsRoot}" --pipeline${safeSince}`,
|
|
225
|
+
healGeneratedTests: `npx e2e-ai-agents approve-and-generate --path "${context.appPath}" --tests-root "${context.testsRoot}" --pipeline --pipeline-mcp${safeSince}`,
|
|
226
|
+
commitGeneratedTests: `npx e2e-ai-agents finalize-generated-tests --path "${context.appPath}" --tests-root "${context.testsRoot}" --commit-message "test(e2e): add generated coverage and healed specs"`,
|
|
227
|
+
openPullRequest: `npx e2e-ai-agents finalize-generated-tests --path "${context.appPath}" --tests-root "${context.testsRoot}" --create-pr`,
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function writePlanReport(appRoot, plan) {
|
|
232
|
+
const baseDir = (0, path_1.join)(appRoot, '.e2e-ai-agents');
|
|
233
|
+
(0, fs_1.mkdirSync)(baseDir, { recursive: true });
|
|
234
|
+
const planPath = (0, path_1.join)(baseDir, 'plan.json');
|
|
235
|
+
(0, fs_1.writeFileSync)(planPath, JSON.stringify(plan, null, 2), 'utf-8');
|
|
236
|
+
return planPath;
|
|
237
|
+
}
|
|
238
|
+
function renderCiSummaryMarkdown(plan) {
|
|
239
|
+
const lines = [];
|
|
240
|
+
lines.push(`## E2E Agent Recommendation: ${plan.decision.title}`);
|
|
241
|
+
lines.push('');
|
|
242
|
+
lines.push(`- Action: \`${plan.decision.action}\``);
|
|
243
|
+
lines.push(`- Run set: \`${plan.runSet}\``);
|
|
244
|
+
lines.push(`- Confidence: \`${plan.confidence}\``);
|
|
245
|
+
lines.push(`- Summary: ${plan.decision.summary}`);
|
|
246
|
+
if (plan.policy.triggeredRules.length > 0) {
|
|
247
|
+
lines.push(`- Policy triggers: ${plan.policy.triggeredRules.join(', ')}`);
|
|
248
|
+
}
|
|
249
|
+
if (plan.policy.riskyFiles.length > 0) {
|
|
250
|
+
lines.push(`- Risky files: ${plan.policy.riskyFiles.join(', ')}`);
|
|
251
|
+
}
|
|
252
|
+
if (plan.recommendedTests.length > 0) {
|
|
253
|
+
lines.push('');
|
|
254
|
+
lines.push('### Recommended Tests to Run');
|
|
255
|
+
for (const test of plan.recommendedTests) {
|
|
256
|
+
lines.push(`- ${test}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (plan.requiredNewTests.length > 0) {
|
|
260
|
+
lines.push('');
|
|
261
|
+
lines.push('### Required New Tests');
|
|
262
|
+
for (const gap of plan.requiredNewTests) {
|
|
263
|
+
lines.push(`- ${gap}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (plan.nextActions) {
|
|
267
|
+
lines.push('');
|
|
268
|
+
lines.push('### PR Actions');
|
|
269
|
+
if (plan.nextActions.runRecommendedTests) {
|
|
270
|
+
lines.push(`- Run recommended tests: \`${plan.nextActions.runRecommendedTests}\``);
|
|
271
|
+
}
|
|
272
|
+
else if (plan.nextActions.runSmokeSuite) {
|
|
273
|
+
lines.push(`- Run smoke fallback: \`${plan.nextActions.runSmokeSuite}\``);
|
|
274
|
+
}
|
|
275
|
+
if (plan.nextActions.approveAndGenerate || plan.nextActions.generateMissingTests) {
|
|
276
|
+
lines.push(`- Approve and generate missing tests: \`${plan.nextActions.approveAndGenerate || plan.nextActions.generateMissingTests}\``);
|
|
277
|
+
}
|
|
278
|
+
if (plan.nextActions.healGeneratedTests) {
|
|
279
|
+
lines.push(`- Heal generated tests: \`${plan.nextActions.healGeneratedTests}\``);
|
|
280
|
+
}
|
|
281
|
+
if (plan.nextActions.commitGeneratedTests) {
|
|
282
|
+
lines.push(`- Commit generated artifacts: \`${plan.nextActions.commitGeneratedTests}\``);
|
|
283
|
+
}
|
|
284
|
+
if (plan.nextActions.openPullRequest) {
|
|
285
|
+
lines.push(`- Open PR with generated updates: \`${plan.nextActions.openPullRequest}\``);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (plan.insights?.qualityGates) {
|
|
289
|
+
if (plan.insights.qualityGates.failed.length > 0) {
|
|
290
|
+
lines.push('');
|
|
291
|
+
lines.push('### Quality Gates Failed');
|
|
292
|
+
for (const gate of plan.insights.qualityGates.failed) {
|
|
293
|
+
lines.push(`- ${gate.name}${gate.details ? `: ${gate.details}` : ''}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (plan.insights.qualityGates.warnings.length > 0) {
|
|
297
|
+
lines.push('');
|
|
298
|
+
lines.push('### Quality Gate Warnings');
|
|
299
|
+
for (const gate of plan.insights.qualityGates.warnings) {
|
|
300
|
+
lines.push(`- ${gate.name}${gate.details ? `: ${gate.details}` : ''}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (plan.insights?.flaky && plan.insights.flaky.highRiskRecommendedTests.length > 0) {
|
|
305
|
+
lines.push('');
|
|
306
|
+
lines.push('### Flaky Risk Alerts');
|
|
307
|
+
for (const item of plan.insights.flaky.highRiskRecommendedTests) {
|
|
308
|
+
const rate = item.flakeRate30d !== undefined ? item.flakeRate30d : item.flakeRate;
|
|
309
|
+
const trend = item.trend ? `, trend=${item.trend}` : '';
|
|
310
|
+
const subsystem = item.subsystem ? `, subsystem=${item.subsystem}` : '';
|
|
311
|
+
const qstate = item.quarantineState && item.quarantineState !== 'none' ? `, quarantine=${item.quarantineState}` : '';
|
|
312
|
+
lines.push(`- ${item.test} (flakeRate=${rate}${trend}${subsystem}${qstate})`);
|
|
313
|
+
}
|
|
314
|
+
if (plan.insights.flaky.ownerMentions && plan.insights.flaky.ownerMentions.length > 0) {
|
|
315
|
+
lines.push(`- Notify owners: ${plan.insights.flaky.ownerMentions.join(', ')}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (plan.insights?.calibration) {
|
|
319
|
+
lines.push('');
|
|
320
|
+
lines.push('### Historical Calibration');
|
|
321
|
+
lines.push(`- precision=${plan.insights.calibration.precision}, recall=${plan.insights.calibration.recall}, falseNegativeRate=${plan.insights.calibration.falseNegativeRate}`);
|
|
322
|
+
}
|
|
323
|
+
return lines.join('\n');
|
|
324
|
+
}
|
|
325
|
+
function writeCiSummary(appRoot, markdown, relativePath = '.e2e-ai-agents/ci-summary.md') {
|
|
326
|
+
const fullPath = (0, path_1.join)(appRoot, relativePath);
|
|
327
|
+
const dir = (0, path_1.dirname)(fullPath);
|
|
328
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
329
|
+
(0, fs_1.writeFileSync)(fullPath, markdown, 'utf-8');
|
|
330
|
+
return fullPath;
|
|
331
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface UnstablePlaywrightSpec {
|
|
2
|
+
specPath: string;
|
|
3
|
+
status: 'failed' | 'flaky';
|
|
4
|
+
failingTests: number;
|
|
5
|
+
flakyTests: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function extractPlaywrightUnstableSpecs(reportPath: string, roots: string[]): UnstablePlaywrightSpec[];
|
|
8
|
+
//# sourceMappingURL=playwright_report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright_report.d.ts","sourceRoot":"","sources":["../../src/agent/playwright_report.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACtB;AA4HD,wBAAgB,8BAA8B,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAW5G"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
3
|
+
// See LICENSE.txt for license information.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.extractPlaywrightUnstableSpecs = extractPlaywrightUnstableSpecs;
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const utils_js_1 = require("./utils.js");
|
|
9
|
+
function asRecord(value) {
|
|
10
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
function asArray(value) {
|
|
16
|
+
return Array.isArray(value) ? value : [];
|
|
17
|
+
}
|
|
18
|
+
function isFailureStatus(value) {
|
|
19
|
+
return value === 'failed' || value === 'timedOut' || value === 'interrupted';
|
|
20
|
+
}
|
|
21
|
+
function classifyTestInstability(testNode) {
|
|
22
|
+
const outcome = typeof testNode.outcome === 'string' ? testNode.outcome : '';
|
|
23
|
+
if (outcome === 'unexpected') {
|
|
24
|
+
return 'failed';
|
|
25
|
+
}
|
|
26
|
+
if (outcome === 'flaky') {
|
|
27
|
+
return 'flaky';
|
|
28
|
+
}
|
|
29
|
+
const status = typeof testNode.status === 'string' ? testNode.status : '';
|
|
30
|
+
if (status === 'flaky') {
|
|
31
|
+
return 'flaky';
|
|
32
|
+
}
|
|
33
|
+
if (isFailureStatus(status)) {
|
|
34
|
+
return 'failed';
|
|
35
|
+
}
|
|
36
|
+
let sawFailure = false;
|
|
37
|
+
let sawPass = false;
|
|
38
|
+
for (const resultValue of asArray(testNode.results)) {
|
|
39
|
+
const resultNode = asRecord(resultValue);
|
|
40
|
+
if (!resultNode) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const resultStatus = typeof resultNode.status === 'string' ? resultNode.status : '';
|
|
44
|
+
if (isFailureStatus(resultStatus)) {
|
|
45
|
+
sawFailure = true;
|
|
46
|
+
}
|
|
47
|
+
else if (resultStatus === 'passed') {
|
|
48
|
+
sawPass = true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (sawFailure && sawPass) {
|
|
52
|
+
return 'flaky';
|
|
53
|
+
}
|
|
54
|
+
if (sawFailure) {
|
|
55
|
+
return 'failed';
|
|
56
|
+
}
|
|
57
|
+
return 'stable';
|
|
58
|
+
}
|
|
59
|
+
function relativize(pathValue, roots) {
|
|
60
|
+
const normalized = (0, utils_js_1.normalizePath)(pathValue);
|
|
61
|
+
for (const root of roots) {
|
|
62
|
+
const normalizedRoot = (0, utils_js_1.normalizePath)((0, path_1.resolve)(root));
|
|
63
|
+
if (normalized === normalizedRoot) {
|
|
64
|
+
return '.';
|
|
65
|
+
}
|
|
66
|
+
if (normalized.startsWith(`${normalizedRoot}/`)) {
|
|
67
|
+
return normalized.slice(normalizedRoot.length + 1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return normalized;
|
|
71
|
+
}
|
|
72
|
+
function collectUnstableSpecs(value, roots, unstableMap) {
|
|
73
|
+
const node = asRecord(value);
|
|
74
|
+
if (!node) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
for (const specValue of asArray(node.specs)) {
|
|
78
|
+
const specNode = asRecord(specValue);
|
|
79
|
+
if (!specNode || typeof specNode.file !== 'string') {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
let failingTests = 0;
|
|
83
|
+
let flakyTests = 0;
|
|
84
|
+
for (const testValue of asArray(specNode.tests)) {
|
|
85
|
+
const testNode = asRecord(testValue);
|
|
86
|
+
if (!testNode) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const instability = classifyTestInstability(testNode);
|
|
90
|
+
if (instability === 'failed') {
|
|
91
|
+
failingTests += 1;
|
|
92
|
+
}
|
|
93
|
+
else if (instability === 'flaky') {
|
|
94
|
+
flakyTests += 1;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (failingTests === 0 && flakyTests === 0) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const specPath = relativize(specNode.file, roots);
|
|
101
|
+
const existing = unstableMap.get(specPath);
|
|
102
|
+
const mergedFailing = (existing?.failingTests || 0) + failingTests;
|
|
103
|
+
const mergedFlaky = (existing?.flakyTests || 0) + flakyTests;
|
|
104
|
+
unstableMap.set(specPath, {
|
|
105
|
+
specPath,
|
|
106
|
+
status: mergedFailing > 0 ? 'failed' : 'flaky',
|
|
107
|
+
failingTests: mergedFailing,
|
|
108
|
+
flakyTests: mergedFlaky,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
for (const suite of asArray(node.suites)) {
|
|
112
|
+
collectUnstableSpecs(suite, roots, unstableMap);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function extractPlaywrightUnstableSpecs(reportPath, roots) {
|
|
116
|
+
const fullPath = (0, path_1.resolve)(reportPath);
|
|
117
|
+
const raw = JSON.parse((0, fs_1.readFileSync)(fullPath, 'utf-8'));
|
|
118
|
+
const unstableMap = new Map();
|
|
119
|
+
collectUnstableSpecs(raw, roots, unstableMap);
|
|
120
|
+
return Array.from(unstableMap.values()).sort((a, b) => {
|
|
121
|
+
if (a.status !== b.status) {
|
|
122
|
+
return a.status === 'failed' ? -1 : 1;
|
|
123
|
+
}
|
|
124
|
+
return a.specPath.localeCompare(b.specPath);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
3
|
+
* See LICENSE.txt for license information.
|
|
4
|
+
*
|
|
5
|
+
* Report Generation Engine
|
|
6
|
+
*
|
|
7
|
+
* Generates console, markdown, and JSON reports from impact analysis results.
|
|
8
|
+
*/
|
|
9
|
+
import type { ImpactReport } from './impact-analyzer';
|
|
10
|
+
export interface ReportOptions {
|
|
11
|
+
console?: boolean;
|
|
12
|
+
markdown?: boolean;
|
|
13
|
+
json?: boolean;
|
|
14
|
+
outputDir?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate all requested report formats
|
|
18
|
+
*/
|
|
19
|
+
export declare function generateReports(analysis: ImpactReport, options?: ReportOptions): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* JSON report is generated directly in generateReports()
|
|
22
|
+
* No additional formatting needed
|
|
23
|
+
*/
|
|
24
|
+
//# sourceMappingURL=report-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../src/agent/report-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAMpD,MAAM,WAAW,aAAa;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BxG;AAkQD;;;GAGG"}
|