@yasserkhanorg/e2e-agents 1.8.5 → 1.9.5

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.
Files changed (256) hide show
  1. package/README.md +95 -8
  2. package/dist/adapters/cypress.d.ts +10 -0
  3. package/dist/adapters/cypress.d.ts.map +1 -0
  4. package/dist/adapters/cypress.js +86 -0
  5. package/dist/adapters/framework_adapter.d.ts +41 -0
  6. package/dist/adapters/framework_adapter.d.ts.map +1 -0
  7. package/dist/adapters/framework_adapter.js +152 -0
  8. package/dist/adapters/playwright.d.ts +10 -0
  9. package/dist/adapters/playwright.d.ts.map +1 -0
  10. package/dist/adapters/playwright.js +86 -0
  11. package/dist/adapters/pytest.d.ts +10 -0
  12. package/dist/adapters/pytest.d.ts.map +1 -0
  13. package/dist/adapters/pytest.js +96 -0
  14. package/dist/adapters/supertest.d.ts +12 -0
  15. package/dist/adapters/supertest.d.ts.map +1 -0
  16. package/dist/adapters/supertest.js +85 -0
  17. package/dist/agent/config.d.ts +1 -1
  18. package/dist/agent/config.d.ts.map +1 -1
  19. package/dist/agent/git.d.ts +1 -0
  20. package/dist/agent/git.d.ts.map +1 -1
  21. package/dist/agent/git.js +3 -0
  22. package/dist/agentic/fix_loop.d.ts.map +1 -1
  23. package/dist/agentic/fix_loop.js +5 -4
  24. package/dist/agentic/runner.d.ts +2 -0
  25. package/dist/agentic/runner.d.ts.map +1 -1
  26. package/dist/agentic/runner.js +15 -12
  27. package/dist/agents/cross-impact.d.ts.map +1 -1
  28. package/dist/agents/cross-impact.js +6 -1
  29. package/dist/agents/executor.d.ts.map +1 -1
  30. package/dist/agents/executor.js +6 -1
  31. package/dist/agents/strategist.d.ts.map +1 -1
  32. package/dist/agents/strategist.js +6 -1
  33. package/dist/agents/test-designer.d.ts.map +1 -1
  34. package/dist/agents/test-designer.js +6 -1
  35. package/dist/anthropic_provider.d.ts.map +1 -1
  36. package/dist/anthropic_provider.js +1 -0
  37. package/dist/base_provider.d.ts +56 -0
  38. package/dist/base_provider.d.ts.map +1 -1
  39. package/dist/base_provider.js +123 -1
  40. package/dist/budget_ledger.d.ts +28 -0
  41. package/dist/budget_ledger.d.ts.map +1 -0
  42. package/dist/budget_ledger.js +62 -0
  43. package/dist/cache/cached_provider.d.ts +45 -0
  44. package/dist/cache/cached_provider.d.ts.map +1 -0
  45. package/dist/cache/cached_provider.js +88 -0
  46. package/dist/cache/response_cache.d.ts +79 -0
  47. package/dist/cache/response_cache.d.ts.map +1 -0
  48. package/dist/cache/response_cache.js +177 -0
  49. package/dist/cli/commands/bootstrap.d.ts +3 -0
  50. package/dist/cli/commands/bootstrap.d.ts.map +1 -0
  51. package/dist/cli/commands/bootstrap.js +109 -0
  52. package/dist/cli/commands/cost_report.d.ts +3 -0
  53. package/dist/cli/commands/cost_report.d.ts.map +1 -0
  54. package/dist/cli/commands/cost_report.js +115 -0
  55. package/dist/cli/commands/crew.d.ts.map +1 -1
  56. package/dist/cli/commands/crew.js +118 -1
  57. package/dist/cli/commands/gate.d.ts +3 -0
  58. package/dist/cli/commands/gate.d.ts.map +1 -0
  59. package/dist/cli/commands/gate.js +86 -0
  60. package/dist/cli/commands/init.d.ts.map +1 -1
  61. package/dist/cli/commands/init.js +7 -62
  62. package/dist/cli/commands/train.d.ts.map +1 -1
  63. package/dist/cli/commands/train.js +16 -21
  64. package/dist/cli/defaults.d.ts +35 -0
  65. package/dist/cli/defaults.d.ts.map +1 -0
  66. package/dist/cli/defaults.js +125 -0
  67. package/dist/cli/errors.d.ts +27 -0
  68. package/dist/cli/errors.d.ts.map +1 -0
  69. package/dist/cli/errors.js +57 -0
  70. package/dist/cli/parse_args.d.ts.map +1 -1
  71. package/dist/cli/parse_args.js +24 -2
  72. package/dist/cli/types.d.ts +7 -1
  73. package/dist/cli/types.d.ts.map +1 -1
  74. package/dist/cli.js +47 -2
  75. package/dist/crew/context.d.ts +15 -0
  76. package/dist/crew/context.d.ts.map +1 -1
  77. package/dist/crew/orchestrator.d.ts +14 -0
  78. package/dist/crew/orchestrator.d.ts.map +1 -1
  79. package/dist/crew/orchestrator.js +162 -4
  80. package/dist/crew/protocol.d.ts +13 -0
  81. package/dist/crew/protocol.d.ts.map +1 -1
  82. package/dist/crew/provider.d.ts +15 -1
  83. package/dist/crew/provider.d.ts.map +1 -1
  84. package/dist/crew/provider.js +24 -4
  85. package/dist/custom_provider.d.ts.map +1 -1
  86. package/dist/custom_provider.js +1 -0
  87. package/dist/engine/diff_loader.d.ts.map +1 -1
  88. package/dist/engine/diff_loader.js +3 -14
  89. package/dist/engine/impact_engine.d.ts.map +1 -1
  90. package/dist/engine/impact_engine.js +9 -23
  91. package/dist/esm/adapters/cypress.js +49 -0
  92. package/dist/esm/adapters/framework_adapter.js +114 -0
  93. package/dist/esm/adapters/playwright.js +49 -0
  94. package/dist/esm/adapters/pytest.js +59 -0
  95. package/dist/esm/adapters/supertest.js +48 -0
  96. package/dist/esm/agent/git.js +3 -1
  97. package/dist/esm/agentic/fix_loop.js +5 -4
  98. package/dist/esm/agentic/runner.js +15 -12
  99. package/dist/esm/agents/cross-impact.js +6 -1
  100. package/dist/esm/agents/executor.js +6 -1
  101. package/dist/esm/agents/strategist.js +6 -1
  102. package/dist/esm/agents/test-designer.js +6 -1
  103. package/dist/esm/anthropic_provider.js +1 -0
  104. package/dist/esm/base_provider.js +121 -0
  105. package/dist/esm/budget_ledger.js +58 -0
  106. package/dist/esm/cache/cached_provider.js +82 -0
  107. package/dist/esm/cache/response_cache.js +140 -0
  108. package/dist/esm/cli/commands/bootstrap.js +106 -0
  109. package/dist/esm/cli/commands/cost_report.js +112 -0
  110. package/dist/esm/cli/commands/crew.js +118 -1
  111. package/dist/esm/cli/commands/gate.js +83 -0
  112. package/dist/esm/cli/commands/init.js +3 -58
  113. package/dist/esm/cli/commands/train.js +16 -21
  114. package/dist/esm/cli/defaults.js +118 -0
  115. package/dist/esm/cli/errors.js +52 -0
  116. package/dist/esm/cli/parse_args.js +24 -2
  117. package/dist/esm/cli.js +47 -2
  118. package/dist/esm/crew/orchestrator.js +162 -4
  119. package/dist/esm/crew/provider.js +24 -4
  120. package/dist/esm/custom_provider.js +1 -0
  121. package/dist/esm/engine/diff_loader.js +1 -12
  122. package/dist/esm/engine/impact_engine.js +9 -23
  123. package/dist/esm/index.js +21 -0
  124. package/dist/esm/knowledge/cluster_utils.js +60 -0
  125. package/dist/esm/knowledge/kg_bridge.js +381 -0
  126. package/dist/esm/knowledge/kg_types.js +3 -0
  127. package/dist/esm/knowledge/route_families.js +89 -0
  128. package/dist/esm/mcp-server.js +2 -4
  129. package/dist/esm/metrics/prometheus.js +149 -0
  130. package/dist/esm/model_router.js +59 -0
  131. package/dist/esm/ollama_provider.js +1 -0
  132. package/dist/esm/openai_provider.js +1 -0
  133. package/dist/esm/pipeline/orchestrator.js +6 -12
  134. package/dist/esm/pipeline/stage0_preprocess.js +12 -19
  135. package/dist/esm/pipeline/stage2_coverage.js +1 -0
  136. package/dist/esm/pipeline/stage3_generation.js +1 -0
  137. package/dist/esm/progress.js +112 -0
  138. package/dist/esm/prompts/coverage.js +7 -24
  139. package/dist/esm/prompts/cross-impact.js +3 -21
  140. package/dist/esm/prompts/generation.js +158 -36
  141. package/dist/esm/prompts/generation_profile.js +147 -0
  142. package/dist/esm/prompts/heal.js +33 -15
  143. package/dist/esm/prompts/impact.js +3 -22
  144. package/dist/esm/prompts/json_extract.js +36 -0
  145. package/dist/esm/prompts/strategist.js +2 -20
  146. package/dist/esm/prompts/test-designer.js +6 -21
  147. package/dist/esm/provider_factory.js +6 -4
  148. package/dist/esm/reporters/junit.js +86 -0
  149. package/dist/esm/reporters/reporter.js +3 -0
  150. package/dist/esm/reporters/sarif.js +131 -0
  151. package/dist/esm/resilience/circuit_breaker.js +78 -0
  152. package/dist/esm/resilience/retry.js +56 -0
  153. package/dist/esm/sanitize.js +66 -0
  154. package/dist/esm/training/kg_scanner.js +115 -0
  155. package/dist/esm/training/scanner.js +27 -34
  156. package/dist/esm/version.js +33 -0
  157. package/dist/index.d.ts +21 -1
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +45 -1
  160. package/dist/knowledge/cluster_utils.d.ts +28 -0
  161. package/dist/knowledge/cluster_utils.d.ts.map +1 -0
  162. package/dist/knowledge/cluster_utils.js +67 -0
  163. package/dist/knowledge/kg_bridge.d.ts +31 -0
  164. package/dist/knowledge/kg_bridge.d.ts.map +1 -0
  165. package/dist/knowledge/kg_bridge.js +388 -0
  166. package/dist/knowledge/kg_types.d.ts +75 -0
  167. package/dist/knowledge/kg_types.d.ts.map +1 -0
  168. package/dist/knowledge/kg_types.js +4 -0
  169. package/dist/knowledge/route_families.d.ts +18 -0
  170. package/dist/knowledge/route_families.d.ts.map +1 -1
  171. package/dist/knowledge/route_families.js +91 -0
  172. package/dist/mcp-server.d.ts.map +1 -1
  173. package/dist/mcp-server.js +2 -4
  174. package/dist/metrics/prometheus.d.ts +37 -0
  175. package/dist/metrics/prometheus.d.ts.map +1 -0
  176. package/dist/metrics/prometheus.js +153 -0
  177. package/dist/model_router.d.ts +28 -0
  178. package/dist/model_router.d.ts.map +1 -0
  179. package/dist/model_router.js +63 -0
  180. package/dist/ollama_provider.d.ts.map +1 -1
  181. package/dist/ollama_provider.js +1 -0
  182. package/dist/openai_provider.d.ts.map +1 -1
  183. package/dist/openai_provider.js +1 -0
  184. package/dist/pipeline/orchestrator.d.ts +2 -0
  185. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  186. package/dist/pipeline/orchestrator.js +6 -12
  187. package/dist/pipeline/stage0_preprocess.d.ts.map +1 -1
  188. package/dist/pipeline/stage0_preprocess.js +11 -18
  189. package/dist/pipeline/stage2_coverage.d.ts +2 -0
  190. package/dist/pipeline/stage2_coverage.d.ts.map +1 -1
  191. package/dist/pipeline/stage2_coverage.js +1 -0
  192. package/dist/pipeline/stage3_generation.d.ts +2 -0
  193. package/dist/pipeline/stage3_generation.d.ts.map +1 -1
  194. package/dist/pipeline/stage3_generation.js +1 -0
  195. package/dist/pipeline/stage4_heal.d.ts +2 -0
  196. package/dist/pipeline/stage4_heal.d.ts.map +1 -1
  197. package/dist/progress.d.ts +22 -0
  198. package/dist/progress.d.ts.map +1 -0
  199. package/dist/progress.js +116 -0
  200. package/dist/prompts/coverage.d.ts +2 -0
  201. package/dist/prompts/coverage.d.ts.map +1 -1
  202. package/dist/prompts/coverage.js +7 -24
  203. package/dist/prompts/cross-impact.d.ts +1 -0
  204. package/dist/prompts/cross-impact.d.ts.map +1 -1
  205. package/dist/prompts/cross-impact.js +3 -21
  206. package/dist/prompts/generation.d.ts +3 -1
  207. package/dist/prompts/generation.d.ts.map +1 -1
  208. package/dist/prompts/generation.js +158 -36
  209. package/dist/prompts/generation_profile.d.ts +29 -0
  210. package/dist/prompts/generation_profile.d.ts.map +1 -0
  211. package/dist/prompts/generation_profile.js +151 -0
  212. package/dist/prompts/heal.d.ts +3 -1
  213. package/dist/prompts/heal.d.ts.map +1 -1
  214. package/dist/prompts/heal.js +33 -15
  215. package/dist/prompts/impact.d.ts +1 -0
  216. package/dist/prompts/impact.d.ts.map +1 -1
  217. package/dist/prompts/impact.js +3 -22
  218. package/dist/prompts/json_extract.d.ts +14 -0
  219. package/dist/prompts/json_extract.d.ts.map +1 -0
  220. package/dist/prompts/json_extract.js +39 -0
  221. package/dist/prompts/strategist.d.ts.map +1 -1
  222. package/dist/prompts/strategist.js +2 -20
  223. package/dist/prompts/test-designer.d.ts +2 -0
  224. package/dist/prompts/test-designer.d.ts.map +1 -1
  225. package/dist/prompts/test-designer.js +6 -21
  226. package/dist/provider_factory.d.ts.map +1 -1
  227. package/dist/provider_factory.js +6 -4
  228. package/dist/reporters/junit.d.ts +6 -0
  229. package/dist/reporters/junit.d.ts.map +1 -0
  230. package/dist/reporters/junit.js +89 -0
  231. package/dist/reporters/reporter.d.ts +42 -0
  232. package/dist/reporters/reporter.d.ts.map +1 -0
  233. package/dist/reporters/reporter.js +4 -0
  234. package/dist/reporters/sarif.d.ts +7 -0
  235. package/dist/reporters/sarif.d.ts.map +1 -0
  236. package/dist/reporters/sarif.js +134 -0
  237. package/dist/resilience/circuit_breaker.d.ts +36 -0
  238. package/dist/resilience/circuit_breaker.d.ts.map +1 -0
  239. package/dist/resilience/circuit_breaker.js +82 -0
  240. package/dist/resilience/retry.d.ts +11 -0
  241. package/dist/resilience/retry.d.ts.map +1 -0
  242. package/dist/resilience/retry.js +59 -0
  243. package/dist/sanitize.d.ts +15 -0
  244. package/dist/sanitize.d.ts.map +1 -0
  245. package/dist/sanitize.js +71 -0
  246. package/dist/training/kg_scanner.d.ts +13 -0
  247. package/dist/training/kg_scanner.d.ts.map +1 -0
  248. package/dist/training/kg_scanner.js +118 -0
  249. package/dist/training/scanner.d.ts +7 -2
  250. package/dist/training/scanner.d.ts.map +1 -1
  251. package/dist/training/scanner.js +27 -34
  252. package/dist/version.d.ts +6 -0
  253. package/dist/version.d.ts.map +1 -0
  254. package/dist/version.js +36 -0
  255. package/package.json +7 -2
  256. package/schemas/route-families.schema.json +31 -1
@@ -11,6 +11,7 @@ exports.discoverNameMatchedPaths = discoverNameMatchedPaths;
11
11
  exports.scanProject = scanProject;
12
12
  const fs_1 = require("fs");
13
13
  const path_1 = require("path");
14
+ const cluster_utils_js_1 = require("../knowledge/cluster_utils.js");
14
15
  const SOURCE_MAX_DEPTH = 3;
15
16
  // One deeper than source to account for test framework wrapper dirs (e2e/, integration/)
16
17
  const TEST_MAX_DEPTH = 5;
@@ -44,10 +45,11 @@ const STRUCTURAL_DIRS = new Set([
44
45
  'middleware', 'contexts', 'providers', 'layouts', 'templates',
45
46
  ]);
46
47
  /**
47
- * Server Go files that are infrastructure / cross-cutting concerns,
48
+ * Default server Go files that are infrastructure / cross-cutting concerns,
48
49
  * not feature-specific domains. Matched after stripping _local/_store suffixes.
50
+ * Override via ScannerConfig.serverInfraFiles.
49
51
  */
50
- const SERVER_INFRA_FILES = new Set([
52
+ const DEFAULT_SERVER_INFRA_FILES = new Set([
51
53
  'api', 'apitestlib', 'context', 'helpers', 'params', 'swagger',
52
54
  'app', 'server', 'enterprise', 'product_service', 'security_update_check',
53
55
  'store', 'adapters', 'errors', 'integrity', 'migrate', 'doc',
@@ -57,10 +59,11 @@ const SERVER_INFRA_FILES = new Set([
57
59
  'manifest', 'permission', 'log', 'utils',
58
60
  ]);
59
61
  /**
60
- * Server tier directories to scan for Go domain files.
62
+ * Default server tier directories to scan for Go domain files.
61
63
  * Each tier represents a layer of the backend architecture.
64
+ * Override via ScannerConfig.serverTiers.
62
65
  */
63
- const SERVER_TIERS = [
66
+ const DEFAULT_SERVER_TIERS = [
64
67
  'channels/api4',
65
68
  'channels/app',
66
69
  'channels/store/sqlstore',
@@ -73,13 +76,7 @@ const includes = (arr, v) => arr.includes(v);
73
76
  function isSkipped(name) {
74
77
  return name.startsWith('.') || SKIP_DIRS.has(name);
75
78
  }
76
- function normalizeId(name) {
77
- return name
78
- .replace(/[A-Z]/g, (c, idx) => (idx > 0 ? `_${c.toLowerCase()}` : c.toLowerCase()))
79
- .replace(/[^a-z0-9_]/g, '_')
80
- .replace(/_+/g, '_')
81
- .replace(/^_|_$/g, '');
82
- }
79
+ const normalizeId = cluster_utils_js_1.normalizeToClusterId;
83
80
  function extractFamilyHint(dirPath, projectRoot) {
84
81
  const rel = (0, path_1.relative)(projectRoot, dirPath).replace(/\\/g, '/');
85
82
  const parts = rel.split('/').filter(Boolean);
@@ -97,32 +94,25 @@ function walkDirs(root, projectRoot, category, maxDepth, results, depth = 0) {
97
94
  if (depth > maxDepth || !(0, fs_1.existsSync)(root)) {
98
95
  return;
99
96
  }
100
- let entries;
97
+ let dirents;
101
98
  try {
102
- entries = (0, fs_1.readdirSync)(root);
99
+ dirents = (0, fs_1.readdirSync)(root, { withFileTypes: true });
103
100
  }
104
101
  catch {
105
102
  // ENOENT or EACCES — skip inaccessible entries
106
103
  return;
107
104
  }
108
- const hasSourceFiles = entries.some((e) => {
109
- const ext = e.slice(e.lastIndexOf('.'));
105
+ const hasSourceFiles = dirents.some((d) => {
106
+ if (!d.isFile())
107
+ return false;
108
+ const ext = d.name.slice(d.name.lastIndexOf('.'));
110
109
  return ['.ts', '.tsx', '.js', '.jsx', '.go', '.py', '.rs'].includes(ext);
111
110
  });
112
- const subdirs = entries.filter((e) => {
113
- if (isSkipped(e))
111
+ const subdirs = dirents.filter((d) => {
112
+ if (!d.isDirectory() || d.isSymbolicLink())
114
113
  return false;
115
- try {
116
- const stat = (0, fs_1.lstatSync)((0, path_1.join)(root, e));
117
- if (stat.isSymbolicLink())
118
- return false;
119
- return stat.isDirectory();
120
- }
121
- catch {
122
- // ENOENT or EACCES — skip inaccessible entries
123
- return false;
124
- }
125
- });
114
+ return !isSkipped(d.name);
115
+ }).map((d) => d.name);
126
116
  if (hasSourceFiles && depth >= 1) {
127
117
  results.push({
128
118
  path: (0, path_1.resolve)(root),
@@ -419,7 +409,7 @@ function findParentDomain(name, allDomains) {
419
409
  *
420
410
  * Each domain becomes a candidate family with precise serverPaths.
421
411
  */
422
- function discoverServerDerivedFamilies(serverRoot) {
412
+ function discoverServerDerivedFamilies(serverRoot, infraFiles = DEFAULT_SERVER_INFRA_FILES, tiers = DEFAULT_SERVER_TIERS) {
423
413
  const resolved = (0, path_1.resolve)(serverRoot);
424
414
  // First pass: collect all raw domain names across tiers
425
415
  const allRawDomains = new Set();
@@ -430,7 +420,7 @@ function discoverServerDerivedFamilies(serverRoot) {
430
420
  return;
431
421
  const baseName = entry.replace('.go', '');
432
422
  const domain = normalizeServerDomain(baseName);
433
- if (!domain || SERVER_INFRA_FILES.has(domain))
423
+ if (!domain || infraFiles.has(domain))
434
424
  return;
435
425
  allRawDomains.add(domain);
436
426
  if (!domainTierFiles.has(domain))
@@ -440,7 +430,7 @@ function discoverServerDerivedFamilies(serverRoot) {
440
430
  tierMap.set(tierRelPath, new Set());
441
431
  tierMap.get(tierRelPath).add(baseName);
442
432
  }
443
- for (const tier of SERVER_TIERS) {
433
+ for (const tier of tiers) {
444
434
  const tierPath = (0, path_1.join)(resolved, tier);
445
435
  if (!(0, fs_1.existsSync)(tierPath))
446
436
  continue;
@@ -477,7 +467,7 @@ function discoverServerDerivedFamilies(serverRoot) {
477
467
  if (!(0, fs_1.lstatSync)(jobPath).isDirectory() || isSkipped(entry))
478
468
  continue;
479
469
  const domain = normalizeId(entry);
480
- if (SERVER_INFRA_FILES.has(domain))
470
+ if (infraFiles.has(domain))
481
471
  continue;
482
472
  allRawDomains.add(domain);
483
473
  const jobFiles = (0, fs_1.readdirSync)(jobPath);
@@ -764,7 +754,10 @@ function discoverNameMatchedPaths(appPath, gitRepoRoot) {
764
754
  }
765
755
  return result;
766
756
  }
767
- function scanProject(projectRoot, testsRoot, serverRoot, gitRepoRoot) {
757
+ function scanProject(projectRoot, testsRoot, serverRoot, gitRepoRoot, config) {
758
+ // Resolve scanner config for this run (passed to functions, no module-level mutation)
759
+ const resolvedInfraFiles = config?.serverInfraFiles || DEFAULT_SERVER_INFRA_FILES;
760
+ const resolvedTiers = config?.serverTiers || DEFAULT_SERVER_TIERS;
768
761
  const resolved = (0, path_1.resolve)(projectRoot);
769
762
  const resolvedTestsRoot = testsRoot ? (0, path_1.resolve)(testsRoot) : resolved;
770
763
  const sourceDirs = discoverSourceDirs(resolved);
@@ -827,7 +820,7 @@ function scanProject(projectRoot, testsRoot, serverRoot, gitRepoRoot) {
827
820
  // When a separate serverRoot is provided, discover families from Go source
828
821
  // filenames across the three-tier backend (api4, app, store).
829
822
  if (serverRoot) {
830
- const { multiTierFamilies: serverMulti, singleTierFamilies: serverSingle } = discoverServerDerivedFamilies((0, path_1.resolve)(serverRoot));
823
+ const { multiTierFamilies: serverMulti, singleTierFamilies: serverSingle } = discoverServerDerivedFamilies((0, path_1.resolve)(serverRoot), resolvedInfraFiles, resolvedTiers);
831
824
  const existingIds = new Set(families.map((f) => f.id));
832
825
  // Merge ALL server families (multi + single tier) into existing families,
833
826
  // but only add NEW families if they span ≥2 tiers.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Returns the package version by reading the nearest package.json.
3
+ * Cached after first call.
4
+ */
5
+ export declare function getVersion(): string;
6
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAoBnC"}
@@ -0,0 +1,36 @@
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.getVersion = getVersion;
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ let _version;
9
+ /**
10
+ * Returns the package version by reading the nearest package.json.
11
+ * Cached after first call.
12
+ */
13
+ function getVersion() {
14
+ if (_version)
15
+ return _version;
16
+ try {
17
+ // Walk up from this file's compiled location to find package.json
18
+ for (let d = __dirname, prev = ''; d !== prev; prev = d, d = (0, path_1.dirname)(d)) {
19
+ try {
20
+ const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(d, 'package.json'), 'utf-8'));
21
+ if (pkg.name === '@yasserkhanorg/e2e-agents' && pkg.version) {
22
+ _version = pkg.version;
23
+ return _version;
24
+ }
25
+ }
26
+ catch {
27
+ // keep walking up
28
+ }
29
+ }
30
+ }
31
+ catch {
32
+ // fallback
33
+ }
34
+ _version = 'unknown';
35
+ return _version;
36
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yasserkhanorg/e2e-agents",
3
- "version": "1.8.5",
3
+ "version": "1.9.5",
4
4
  "description": "AI-powered E2E test impact analysis, generation, and healing. Analyzes code changes to identify affected Playwright tests, detects coverage gaps, and generates or repairs specs using pluggable LLM providers (Claude, OpenAI, Ollama). Includes MCP server, traceability, and CI/CD integration.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -56,6 +56,7 @@
56
56
  "dependencies": {
57
57
  "@anthropic-ai/sdk": "^0.73.0",
58
58
  "glob": "^11.0.0",
59
+ "minimatch": "^10.0.0",
59
60
  "marked": "^15.0.6",
60
61
  "openai": "^4.73.0"
61
62
  },
@@ -103,7 +104,11 @@
103
104
  "vision-analysis",
104
105
  "screenshot-analysis",
105
106
  "test-discovery",
106
- "test-healing"
107
+ "test-healing",
108
+ "impact-analysis",
109
+ "coverage",
110
+ "qa",
111
+ "ci-cd"
107
112
  ],
108
113
  "engines": {
109
114
  "node": ">=20.0.0"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "Route Families Manifest",
4
- "description": "Maps Mattermost route families to file patterns, page objects, components, and nested features.",
4
+ "description": "Maps route families to file patterns, page objects, components, and nested features.",
5
5
  "type": "object",
6
6
  "required": ["families"],
7
7
  "properties": {
@@ -65,6 +65,36 @@
65
65
  "$ref": "#/$defs/RouteFeature"
66
66
  },
67
67
  "description": "Nested features within this family for finer-grained binding"
68
+ },
69
+ "apiEndpoints": {
70
+ "type": "array",
71
+ "items": {
72
+ "$ref": "#/$defs/ApiEndpoint"
73
+ },
74
+ "description": "API endpoints this family covers (for backend/API testing)"
75
+ },
76
+ "testType": {
77
+ "type": "string",
78
+ "enum": ["ui", "api", "both"],
79
+ "description": "Type of tests to generate: UI (browser), API, or both. Defaults to 'ui' for backward compatibility."
80
+ }
81
+ }
82
+ },
83
+ "ApiEndpoint": {
84
+ "type": "object",
85
+ "required": ["method", "path"],
86
+ "properties": {
87
+ "method": {
88
+ "type": "string",
89
+ "description": "HTTP method (GET, POST, PUT, DELETE, PATCH)"
90
+ },
91
+ "path": {
92
+ "type": "string",
93
+ "description": "API endpoint path, e.g. '/api/v4/users'"
94
+ },
95
+ "description": {
96
+ "type": "string",
97
+ "description": "Human-readable description of the endpoint"
68
98
  }
69
99
  }
70
100
  },