@yasserkhanorg/e2e-agents 0.5.6 → 0.5.8
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/dist/agent/plan.d.ts +15 -0
- package/dist/agent/plan.d.ts.map +1 -1
- package/dist/agent/plan.js +23 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +16 -2
- package/dist/esm/agent/plan.js +23 -1
- package/dist/esm/agent/runner.js +16 -2
- package/package.json +1 -1
package/dist/agent/plan.d.ts
CHANGED
|
@@ -12,6 +12,19 @@ export interface DecisionSummary {
|
|
|
12
12
|
title: string;
|
|
13
13
|
summary: string;
|
|
14
14
|
}
|
|
15
|
+
export interface GapDetail {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
priority: string;
|
|
19
|
+
reasons: string[];
|
|
20
|
+
files: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface CoveredFlowSummary {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
priority: string;
|
|
26
|
+
coveredBy: string[];
|
|
27
|
+
}
|
|
15
28
|
export interface PlanReport {
|
|
16
29
|
schemaVersion: '1.0.0';
|
|
17
30
|
runId: string;
|
|
@@ -23,6 +36,8 @@ export interface PlanReport {
|
|
|
23
36
|
reasons: string[];
|
|
24
37
|
recommendedTests: string[];
|
|
25
38
|
requiredNewTests: string[];
|
|
39
|
+
gapDetails: GapDetail[];
|
|
40
|
+
coveredFlows: CoveredFlowSummary[];
|
|
26
41
|
policy: PolicyEvaluation;
|
|
27
42
|
decision: DecisionSummary;
|
|
28
43
|
enforcement: {
|
package/dist/agent/plan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/agent/plan.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/agent/plan.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/plan.js
CHANGED
|
@@ -176,10 +176,14 @@ function buildDecision(runSet, confidence, impact, policy) {
|
|
|
176
176
|
summary: 'No critical coverage gaps were detected and policy confidence is high.',
|
|
177
177
|
};
|
|
178
178
|
}
|
|
179
|
+
const coveredCount = impact.coverage.filter((c) => c.coveredBy.length > 0).length;
|
|
180
|
+
const coverageSuffix = coveredCount > 0
|
|
181
|
+
? ` All ${coveredCount} impacted flow(s) have test coverage.`
|
|
182
|
+
: '';
|
|
179
183
|
return {
|
|
180
184
|
action: 'run-now',
|
|
181
185
|
title: 'Run now',
|
|
182
|
-
summary: `
|
|
186
|
+
summary: `Impacted flows are covered by existing tests.${coverageSuffix} Verify with the E2E suite before merge.`,
|
|
183
187
|
};
|
|
184
188
|
}
|
|
185
189
|
function evaluateEnforcement(decision, policy) {
|
|
@@ -248,6 +252,22 @@ function buildPlanFromImpactReport(impact, policyOverride) {
|
|
|
248
252
|
const decision = buildDecision(runSet.runSet, confidence, impact, policy);
|
|
249
253
|
const enforcement = evaluateEnforcement(decision, policy);
|
|
250
254
|
const requiredNewTests = impact.gaps.map((flow) => `${flow.id}: ${flow.name}`);
|
|
255
|
+
const gapDetails = impact.gaps.map((flow) => ({
|
|
256
|
+
id: flow.id,
|
|
257
|
+
name: flow.name,
|
|
258
|
+
priority: flow.priority,
|
|
259
|
+
reasons: (flow.reasons || []).slice(0, 5),
|
|
260
|
+
files: (flow.files || []).slice(0, 6),
|
|
261
|
+
}));
|
|
262
|
+
const coveredFlowIds = new Set(impact.gaps.map((g) => g.id));
|
|
263
|
+
const coveredFlows = impact.coverage
|
|
264
|
+
.filter((c) => c.coveredBy.length > 0 && !coveredFlowIds.has(c.flowId))
|
|
265
|
+
.map((c) => ({
|
|
266
|
+
id: c.flowId,
|
|
267
|
+
name: c.flowName,
|
|
268
|
+
priority: c.priority,
|
|
269
|
+
coveredBy: c.coveredBy.slice(0, 3),
|
|
270
|
+
}));
|
|
251
271
|
const sourceRunId = impact.runMetadata?.runId;
|
|
252
272
|
const runId = `plan-${sourceRunId || Date.now().toString(36)}`;
|
|
253
273
|
return {
|
|
@@ -261,6 +281,8 @@ function buildPlanFromImpactReport(impact, policyOverride) {
|
|
|
261
281
|
reasons: runSet.reasons,
|
|
262
282
|
recommendedTests: impact.recommendedTests || [],
|
|
263
283
|
requiredNewTests,
|
|
284
|
+
gapDetails,
|
|
285
|
+
coveredFlows,
|
|
264
286
|
policy: {
|
|
265
287
|
riskyFiles: runSet.riskyFiles,
|
|
266
288
|
triggeredRules: runSet.triggeredRules,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AA+R7C,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,OAAO,CAAC;CAClB;AAYD,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AA+R7C,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,OAAO,CAAC;CAClB;AAYD,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuTzF;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAoUtF"}
|
package/dist/agent/runner.js
CHANGED
|
@@ -327,7 +327,14 @@ async function runImpact(_config, _options) {
|
|
|
327
327
|
}
|
|
328
328
|
else {
|
|
329
329
|
flows = analysis.flows;
|
|
330
|
-
if (
|
|
330
|
+
if (changedAppFiles.length === 0) {
|
|
331
|
+
// No app files changed (e.g. only CI config or e2e files changed).
|
|
332
|
+
// Treat as zero app impact without calling AI — the gate should pass cleanly.
|
|
333
|
+
flows = [];
|
|
334
|
+
flowMappingSource = 'ai';
|
|
335
|
+
warnings.push('No app files changed; skipping AI flow analysis.');
|
|
336
|
+
}
|
|
337
|
+
else if (_config.impact.aiFlow.enabled) {
|
|
331
338
|
const aiFlow = await (0, ai_flow_analysis_js_1.mapAIFlowsFromFiles)(_config.path, testsRoot, _config.impact.aiFlow, analysis.files, changedAppFiles);
|
|
332
339
|
warnings.push(...aiFlow.warnings);
|
|
333
340
|
if (aiFlow.used) {
|
|
@@ -610,7 +617,14 @@ async function runGap(_config, _options) {
|
|
|
610
617
|
}
|
|
611
618
|
else {
|
|
612
619
|
flows = analysis.flows;
|
|
613
|
-
if (
|
|
620
|
+
if (changedAppFiles.length === 0) {
|
|
621
|
+
// No app files changed (e.g. only CI config or e2e files changed).
|
|
622
|
+
// Treat as zero app impact without calling AI — the gate should pass cleanly.
|
|
623
|
+
flows = [];
|
|
624
|
+
flowMappingSource = 'ai';
|
|
625
|
+
warnings.push('No app files changed; skipping AI flow analysis.');
|
|
626
|
+
}
|
|
627
|
+
else if (_config.impact.aiFlow.enabled) {
|
|
614
628
|
const aiFlow = await (0, ai_flow_analysis_js_1.mapAIFlowsFromFiles)(_config.path, testsRoot, _config.impact.aiFlow, analysis.files, changedAppFiles);
|
|
615
629
|
warnings.push(...aiFlow.warnings);
|
|
616
630
|
if (aiFlow.used) {
|
package/dist/esm/agent/plan.js
CHANGED
|
@@ -167,10 +167,14 @@ function buildDecision(runSet, confidence, impact, policy) {
|
|
|
167
167
|
summary: 'No critical coverage gaps were detected and policy confidence is high.',
|
|
168
168
|
};
|
|
169
169
|
}
|
|
170
|
+
const coveredCount = impact.coverage.filter((c) => c.coveredBy.length > 0).length;
|
|
171
|
+
const coverageSuffix = coveredCount > 0
|
|
172
|
+
? ` All ${coveredCount} impacted flow(s) have test coverage.`
|
|
173
|
+
: '';
|
|
170
174
|
return {
|
|
171
175
|
action: 'run-now',
|
|
172
176
|
title: 'Run now',
|
|
173
|
-
summary: `
|
|
177
|
+
summary: `Impacted flows are covered by existing tests.${coverageSuffix} Verify with the E2E suite before merge.`,
|
|
174
178
|
};
|
|
175
179
|
}
|
|
176
180
|
function evaluateEnforcement(decision, policy) {
|
|
@@ -239,6 +243,22 @@ export function buildPlanFromImpactReport(impact, policyOverride) {
|
|
|
239
243
|
const decision = buildDecision(runSet.runSet, confidence, impact, policy);
|
|
240
244
|
const enforcement = evaluateEnforcement(decision, policy);
|
|
241
245
|
const requiredNewTests = impact.gaps.map((flow) => `${flow.id}: ${flow.name}`);
|
|
246
|
+
const gapDetails = impact.gaps.map((flow) => ({
|
|
247
|
+
id: flow.id,
|
|
248
|
+
name: flow.name,
|
|
249
|
+
priority: flow.priority,
|
|
250
|
+
reasons: (flow.reasons || []).slice(0, 5),
|
|
251
|
+
files: (flow.files || []).slice(0, 6),
|
|
252
|
+
}));
|
|
253
|
+
const coveredFlowIds = new Set(impact.gaps.map((g) => g.id));
|
|
254
|
+
const coveredFlows = impact.coverage
|
|
255
|
+
.filter((c) => c.coveredBy.length > 0 && !coveredFlowIds.has(c.flowId))
|
|
256
|
+
.map((c) => ({
|
|
257
|
+
id: c.flowId,
|
|
258
|
+
name: c.flowName,
|
|
259
|
+
priority: c.priority,
|
|
260
|
+
coveredBy: c.coveredBy.slice(0, 3),
|
|
261
|
+
}));
|
|
242
262
|
const sourceRunId = impact.runMetadata?.runId;
|
|
243
263
|
const runId = `plan-${sourceRunId || Date.now().toString(36)}`;
|
|
244
264
|
return {
|
|
@@ -252,6 +272,8 @@ export function buildPlanFromImpactReport(impact, policyOverride) {
|
|
|
252
272
|
reasons: runSet.reasons,
|
|
253
273
|
recommendedTests: impact.recommendedTests || [],
|
|
254
274
|
requiredNewTests,
|
|
275
|
+
gapDetails,
|
|
276
|
+
coveredFlows,
|
|
255
277
|
policy: {
|
|
256
278
|
riskyFiles: runSet.riskyFiles,
|
|
257
279
|
triggeredRules: runSet.triggeredRules,
|
package/dist/esm/agent/runner.js
CHANGED
|
@@ -323,7 +323,14 @@ export async function runImpact(_config, _options) {
|
|
|
323
323
|
}
|
|
324
324
|
else {
|
|
325
325
|
flows = analysis.flows;
|
|
326
|
-
if (
|
|
326
|
+
if (changedAppFiles.length === 0) {
|
|
327
|
+
// No app files changed (e.g. only CI config or e2e files changed).
|
|
328
|
+
// Treat as zero app impact without calling AI — the gate should pass cleanly.
|
|
329
|
+
flows = [];
|
|
330
|
+
flowMappingSource = 'ai';
|
|
331
|
+
warnings.push('No app files changed; skipping AI flow analysis.');
|
|
332
|
+
}
|
|
333
|
+
else if (_config.impact.aiFlow.enabled) {
|
|
327
334
|
const aiFlow = await mapAIFlowsFromFiles(_config.path, testsRoot, _config.impact.aiFlow, analysis.files, changedAppFiles);
|
|
328
335
|
warnings.push(...aiFlow.warnings);
|
|
329
336
|
if (aiFlow.used) {
|
|
@@ -606,7 +613,14 @@ export async function runGap(_config, _options) {
|
|
|
606
613
|
}
|
|
607
614
|
else {
|
|
608
615
|
flows = analysis.flows;
|
|
609
|
-
if (
|
|
616
|
+
if (changedAppFiles.length === 0) {
|
|
617
|
+
// No app files changed (e.g. only CI config or e2e files changed).
|
|
618
|
+
// Treat as zero app impact without calling AI — the gate should pass cleanly.
|
|
619
|
+
flows = [];
|
|
620
|
+
flowMappingSource = 'ai';
|
|
621
|
+
warnings.push('No app files changed; skipping AI flow analysis.');
|
|
622
|
+
}
|
|
623
|
+
else if (_config.impact.aiFlow.enabled) {
|
|
610
624
|
const aiFlow = await mapAIFlowsFromFiles(_config.path, testsRoot, _config.impact.aiFlow, analysis.files, changedAppFiles);
|
|
611
625
|
warnings.push(...aiFlow.warnings);
|
|
612
626
|
if (aiFlow.used) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yasserkhanorg/e2e-agents",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.8",
|
|
4
4
|
"description": "Pluggable LLM provider library for AI-powered test automation. Use Claude, Ollama, or your own LLM. Integrate with Playwright, Jest, or any test framework. MCP server for test agents, cost tracking, and hybrid provider mode.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|