@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.
@@ -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: {
@@ -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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"}
@@ -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: `Execute the ${runSet} suite for this change set.`,
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,CAiTzF;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8TtF"}
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"}
@@ -327,7 +327,14 @@ async function runImpact(_config, _options) {
327
327
  }
328
328
  else {
329
329
  flows = analysis.flows;
330
- if (_config.impact.aiFlow.enabled) {
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 (_config.impact.aiFlow.enabled) {
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) {
@@ -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: `Execute the ${runSet} suite for this change set.`,
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,
@@ -323,7 +323,14 @@ export async function runImpact(_config, _options) {
323
323
  }
324
324
  else {
325
325
  flows = analysis.flows;
326
- if (_config.impact.aiFlow.enabled) {
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 (_config.impact.aiFlow.enabled) {
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.6",
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",