@browserstack/mcp-server 1.2.3-beta.1 → 1.2.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.
Files changed (126) hide show
  1. package/README.md +88 -2
  2. package/dist/lib/device-cache.js +20 -17
  3. package/dist/lib/inmemory-store.d.ts +1 -0
  4. package/dist/lib/inmemory-store.js +1 -0
  5. package/dist/lib/utils.d.ts +5 -0
  6. package/dist/lib/utils.js +27 -0
  7. package/dist/server-factory.js +6 -0
  8. package/dist/tools/add-percy-snapshots.d.ts +5 -0
  9. package/dist/tools/add-percy-snapshots.js +17 -0
  10. package/dist/tools/appautomate-utils/appium-sdk/types.d.ts +2 -2
  11. package/dist/tools/appautomate-utils/appium-sdk/types.js +2 -9
  12. package/dist/tools/appautomate-utils/appium-sdk/utils.js +3 -0
  13. package/dist/tools/bstack-sdk.d.ts +2 -15
  14. package/dist/tools/bstack-sdk.js +10 -119
  15. package/dist/tools/build-insights.d.ts +7 -0
  16. package/dist/tools/build-insights.js +67 -0
  17. package/dist/tools/list-test-files.d.ts +2 -0
  18. package/dist/tools/list-test-files.js +36 -0
  19. package/dist/tools/percy-sdk.d.ts +4 -0
  20. package/dist/tools/percy-sdk.js +71 -0
  21. package/dist/tools/percy-snapshot-utils/constants.d.ts +16 -0
  22. package/dist/tools/percy-snapshot-utils/constants.js +500 -0
  23. package/dist/tools/percy-snapshot-utils/detect-test-files.d.ts +10 -0
  24. package/dist/tools/percy-snapshot-utils/detect-test-files.js +175 -0
  25. package/dist/tools/percy-snapshot-utils/types.d.ts +15 -0
  26. package/dist/tools/percy-snapshot-utils/utils.d.ts +4 -0
  27. package/dist/tools/percy-snapshot-utils/utils.js +30 -0
  28. package/dist/tools/rca-agent-utils/constants.d.ts +13 -0
  29. package/dist/tools/rca-agent-utils/constants.js +24 -0
  30. package/dist/tools/rca-agent-utils/format-rca.d.ts +1 -0
  31. package/dist/tools/rca-agent-utils/format-rca.js +37 -0
  32. package/dist/tools/rca-agent-utils/get-build-id.d.ts +1 -0
  33. package/dist/tools/rca-agent-utils/get-build-id.js +18 -0
  34. package/dist/tools/rca-agent-utils/get-failed-test-id.d.ts +2 -0
  35. package/dist/tools/rca-agent-utils/get-failed-test-id.js +69 -0
  36. package/dist/tools/rca-agent-utils/rca-data.d.ts +9 -0
  37. package/dist/tools/rca-agent-utils/rca-data.js +196 -0
  38. package/dist/tools/rca-agent-utils/types.d.ts +48 -0
  39. package/dist/tools/rca-agent-utils/types.js +20 -0
  40. package/dist/tools/rca-agent.d.ts +14 -0
  41. package/dist/tools/rca-agent.js +119 -0
  42. package/dist/tools/review-agent-utils/build-counts.d.ts +7 -0
  43. package/dist/tools/review-agent-utils/build-counts.js +44 -0
  44. package/dist/tools/review-agent-utils/percy-approve-reject.d.ts +6 -0
  45. package/dist/tools/review-agent-utils/percy-approve-reject.js +39 -0
  46. package/dist/tools/review-agent-utils/percy-diffs.d.ts +9 -0
  47. package/dist/tools/review-agent-utils/percy-diffs.js +35 -0
  48. package/dist/tools/review-agent-utils/percy-snapshots.d.ts +11 -0
  49. package/dist/tools/review-agent-utils/percy-snapshots.js +58 -0
  50. package/dist/tools/review-agent.d.ts +5 -0
  51. package/dist/tools/review-agent.js +56 -0
  52. package/dist/tools/run-percy-scan.d.ts +8 -0
  53. package/dist/tools/run-percy-scan.js +37 -0
  54. package/dist/tools/sdk-utils/{commands.d.ts → bstack/commands.d.ts} +1 -1
  55. package/dist/tools/sdk-utils/bstack/commands.js +88 -0
  56. package/dist/tools/sdk-utils/bstack/configUtils.d.ts +4 -0
  57. package/dist/tools/sdk-utils/bstack/configUtils.js +66 -0
  58. package/dist/tools/sdk-utils/bstack/constants.d.ts +58 -0
  59. package/dist/tools/sdk-utils/{constants.js → bstack/constants.js} +117 -78
  60. package/dist/tools/sdk-utils/{constants.d.ts → bstack/frameworks.d.ts} +1 -1
  61. package/dist/tools/sdk-utils/bstack/frameworks.js +57 -0
  62. package/dist/tools/sdk-utils/bstack/index.d.ts +4 -0
  63. package/dist/tools/sdk-utils/bstack/index.js +5 -0
  64. package/dist/tools/sdk-utils/bstack/sdkHandler.d.ts +4 -0
  65. package/dist/tools/sdk-utils/bstack/sdkHandler.js +74 -0
  66. package/dist/tools/sdk-utils/common/constants.d.ts +10 -0
  67. package/dist/tools/sdk-utils/common/constants.js +86 -0
  68. package/dist/tools/sdk-utils/common/formatUtils.d.ts +5 -0
  69. package/dist/tools/sdk-utils/common/formatUtils.js +27 -0
  70. package/dist/tools/sdk-utils/common/index.d.ts +3 -0
  71. package/dist/tools/sdk-utils/common/index.js +4 -0
  72. package/dist/tools/sdk-utils/common/instructionUtils.d.ts +8 -0
  73. package/dist/tools/sdk-utils/common/instructionUtils.js +20 -0
  74. package/dist/tools/sdk-utils/common/schema.d.ts +73 -0
  75. package/dist/tools/sdk-utils/common/schema.js +51 -0
  76. package/dist/tools/sdk-utils/common/types.d.ts +66 -0
  77. package/dist/tools/sdk-utils/{types.js → common/types.js} +15 -2
  78. package/dist/tools/sdk-utils/common/utils.d.ts +25 -0
  79. package/dist/tools/sdk-utils/common/utils.js +90 -0
  80. package/dist/tools/sdk-utils/handler.d.ts +4 -0
  81. package/dist/tools/sdk-utils/handler.js +119 -0
  82. package/dist/tools/sdk-utils/percy-automate/constants.d.ts +11 -0
  83. package/dist/tools/sdk-utils/percy-automate/constants.js +338 -0
  84. package/dist/tools/sdk-utils/percy-automate/frameworks.d.ts +8 -0
  85. package/dist/tools/sdk-utils/percy-automate/frameworks.js +50 -0
  86. package/dist/tools/sdk-utils/percy-automate/handler.d.ts +3 -0
  87. package/dist/tools/sdk-utils/percy-automate/handler.js +30 -0
  88. package/dist/tools/sdk-utils/percy-automate/index.d.ts +1 -0
  89. package/dist/tools/sdk-utils/percy-automate/index.js +2 -0
  90. package/dist/tools/sdk-utils/percy-automate/types.d.ts +13 -0
  91. package/dist/tools/sdk-utils/percy-automate/types.js +1 -0
  92. package/dist/tools/sdk-utils/percy-bstack/constants.d.ts +4 -0
  93. package/dist/tools/sdk-utils/{percy → percy-bstack}/constants.js +13 -39
  94. package/dist/tools/sdk-utils/percy-bstack/frameworks.d.ts +2 -0
  95. package/dist/tools/sdk-utils/percy-bstack/frameworks.js +27 -0
  96. package/dist/tools/sdk-utils/percy-bstack/handler.d.ts +4 -0
  97. package/dist/tools/sdk-utils/percy-bstack/handler.js +99 -0
  98. package/dist/tools/sdk-utils/percy-bstack/index.d.ts +4 -0
  99. package/dist/tools/sdk-utils/percy-bstack/index.js +4 -0
  100. package/dist/tools/sdk-utils/percy-bstack/instructions.d.ts +7 -0
  101. package/dist/tools/sdk-utils/{percy → percy-bstack}/instructions.js +5 -9
  102. package/dist/tools/sdk-utils/percy-bstack/types.d.ts +13 -0
  103. package/dist/tools/sdk-utils/percy-bstack/types.js +5 -0
  104. package/dist/tools/sdk-utils/percy-web/constants.d.ts +41 -0
  105. package/dist/tools/sdk-utils/percy-web/constants.js +883 -0
  106. package/dist/tools/sdk-utils/percy-web/fetchPercyToken.d.ts +4 -0
  107. package/dist/tools/sdk-utils/percy-web/fetchPercyToken.js +32 -0
  108. package/dist/tools/sdk-utils/percy-web/frameworks.d.ts +7 -0
  109. package/dist/tools/sdk-utils/percy-web/frameworks.js +103 -0
  110. package/dist/tools/sdk-utils/percy-web/handler.d.ts +4 -0
  111. package/dist/tools/sdk-utils/percy-web/handler.js +27 -0
  112. package/dist/tools/sdk-utils/percy-web/index.d.ts +4 -0
  113. package/dist/tools/sdk-utils/percy-web/index.js +4 -0
  114. package/dist/tools/sdk-utils/percy-web/types.d.ts +12 -0
  115. package/dist/tools/sdk-utils/percy-web/types.js +1 -0
  116. package/dist/tools/testmanagement-utils/create-testrun.d.ts +4 -4
  117. package/dist/tools/testmanagement-utils/update-testrun.d.ts +4 -4
  118. package/package.json +2 -1
  119. package/dist/tools/sdk-utils/commands.js +0 -65
  120. package/dist/tools/sdk-utils/instructions.d.ts +0 -6
  121. package/dist/tools/sdk-utils/instructions.js +0 -99
  122. package/dist/tools/sdk-utils/percy/constants.d.ts +0 -3
  123. package/dist/tools/sdk-utils/percy/instructions.d.ts +0 -10
  124. package/dist/tools/sdk-utils/percy/types.d.ts +0 -5
  125. package/dist/tools/sdk-utils/types.d.ts +0 -40
  126. /package/dist/tools/{sdk-utils/percy → percy-snapshot-utils}/types.js +0 -0
@@ -0,0 +1,71 @@
1
+ import { trackMCP } from "../index.js";
2
+ import { fetchPercyChanges } from "./review-agent.js";
3
+ import { addListTestFiles } from "./list-test-files.js";
4
+ import { runPercyScan } from "./run-percy-scan.js";
5
+ import { SetUpPercyParamsShape } from "./sdk-utils/common/schema.js";
6
+ import { updateTestsWithPercyCommands } from "./add-percy-snapshots.js";
7
+ import { approveOrDeclinePercyBuild } from "./review-agent-utils/percy-approve-reject.js";
8
+ import { setUpPercyHandler } from "./sdk-utils/handler.js";
9
+ import { SETUP_PERCY_DESCRIPTION, LIST_TEST_FILES_DESCRIPTION, PERCY_SNAPSHOT_COMMANDS_DESCRIPTION, } from "./sdk-utils/common/constants.js";
10
+ import { ListTestFilesParamsShape, UpdateTestFileWithInstructionsParams, } from "./percy-snapshot-utils/constants.js";
11
+ import { RunPercyScanParamsShape, FetchPercyChangesParamsShape, ManagePercyBuildApprovalParamsShape, } from "./sdk-utils/common/schema.js";
12
+ import { handleMCPError } from "../lib/utils.js";
13
+ export function registerPercyTools(server, config) {
14
+ const tools = {};
15
+ tools.setupPercyVisualTesting = server.tool("setupPercyVisualTesting", SETUP_PERCY_DESCRIPTION, SetUpPercyParamsShape, async (args) => {
16
+ try {
17
+ trackMCP("setupPercyVisualTesting", server.server.getClientVersion(), config);
18
+ return setUpPercyHandler(args, config);
19
+ }
20
+ catch (error) {
21
+ return handleMCPError("setupPercyVisualTesting", server, config, error);
22
+ }
23
+ });
24
+ tools.addPercySnapshotCommands = server.tool("addPercySnapshotCommands", PERCY_SNAPSHOT_COMMANDS_DESCRIPTION, UpdateTestFileWithInstructionsParams, async (args) => {
25
+ try {
26
+ trackMCP("addPercySnapshotCommands", server.server.getClientVersion(), config);
27
+ return await updateTestsWithPercyCommands(args);
28
+ }
29
+ catch (error) {
30
+ return handleMCPError("addPercySnapshotCommands", server, config, error);
31
+ }
32
+ });
33
+ tools.listTestFiles = server.tool("listTestFiles", LIST_TEST_FILES_DESCRIPTION, ListTestFilesParamsShape, async (args) => {
34
+ try {
35
+ trackMCP("listTestFiles", server.server.getClientVersion(), config);
36
+ return addListTestFiles(args);
37
+ }
38
+ catch (error) {
39
+ return handleMCPError("listTestFiles", server, config, error);
40
+ }
41
+ });
42
+ tools.runPercyScan = server.tool("runPercyScan", "Run a Percy visual test scan. Example prompts : Run this Percy build/scan. Never run percy scan/build without this tool", RunPercyScanParamsShape, async (args) => {
43
+ try {
44
+ trackMCP("runPercyScan", server.server.getClientVersion(), config);
45
+ return runPercyScan(args, config);
46
+ }
47
+ catch (error) {
48
+ return handleMCPError("runPercyScan", server, config, error);
49
+ }
50
+ });
51
+ tools.fetchPercyChanges = server.tool("fetchPercyChanges", "Retrieves and summarizes all visual changes detected by Percy AI between the latest and previous builds, helping quickly review what has changed in your project.", FetchPercyChangesParamsShape, async (args) => {
52
+ try {
53
+ trackMCP("fetchPercyChanges", server.server.getClientVersion(), config);
54
+ return await fetchPercyChanges(args, config);
55
+ }
56
+ catch (error) {
57
+ return handleMCPError("fetchPercyChanges", server, config, error);
58
+ }
59
+ });
60
+ tools.managePercyBuildApproval = server.tool("managePercyBuildApproval", "Approve or reject a Percy build", ManagePercyBuildApprovalParamsShape, async (args) => {
61
+ try {
62
+ trackMCP("managePercyBuildApproval", server.server.getClientVersion(), config);
63
+ return await approveOrDeclinePercyBuild(args, config);
64
+ }
65
+ catch (error) {
66
+ return handleMCPError("managePercyBuildApproval", server, config, error);
67
+ }
68
+ });
69
+ return tools;
70
+ }
71
+ export default registerPercyTools;
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ import { SDKSupportedLanguage } from "../sdk-utils/common/types.js";
3
+ import { DetectionConfig } from "./types.js";
4
+ export declare const UpdateTestFileWithInstructionsParams: {
5
+ uuid: z.ZodString;
6
+ index: z.ZodNumber;
7
+ };
8
+ export declare const ListTestFilesParamsShape: {
9
+ dirs: z.ZodArray<z.ZodString, "many">;
10
+ language: z.ZodEnum<[string, ...string[]]>;
11
+ framework: z.ZodEnum<[string, ...string[]]>;
12
+ };
13
+ export declare const TEST_FILE_DETECTION: Record<SDKSupportedLanguage, DetectionConfig>;
14
+ export declare const EXCLUDED_DIRS: Set<string>;
15
+ export declare const backendIndicators: RegExp[];
16
+ export declare const strongUIIndicators: RegExp[];
@@ -0,0 +1,500 @@
1
+ import { z } from "zod";
2
+ import { SDKSupportedLanguages, SDKSupportedTestingFrameworks, } from "../sdk-utils/common/types.js";
3
+ export const UpdateTestFileWithInstructionsParams = {
4
+ uuid: z
5
+ .string()
6
+ .describe("UUID referencing the in-memory array of test file paths"),
7
+ index: z.number().describe("Index of the test file to update"),
8
+ };
9
+ export const ListTestFilesParamsShape = {
10
+ dirs: z
11
+ .array(z.string())
12
+ .describe("Array of directory paths to search for test files"),
13
+ language: z
14
+ .enum(SDKSupportedLanguages)
15
+ .describe("Programming language"),
16
+ framework: z
17
+ .enum(SDKSupportedTestingFrameworks)
18
+ .describe("Testing framework (optional)"),
19
+ };
20
+ export const TEST_FILE_DETECTION = {
21
+ java: {
22
+ extensions: [".java"],
23
+ namePatterns: [
24
+ /Test\.java$/,
25
+ /Tests\.java$/,
26
+ /Steps\.java$/,
27
+ /.*UI.*Test\.java$/,
28
+ /.*Web.*Test\.java$/,
29
+ /.*E2E.*Test\.java$/,
30
+ /.*Integration.*Test\.java$/,
31
+ /.*Functional.*Test\.java$/,
32
+ ],
33
+ contentRegex: [
34
+ /@Test\b/,
35
+ /@RunWith\b/,
36
+ /@CucumberOptions\b/,
37
+ /import\s+org\.junit/,
38
+ /import\s+org\.testng/,
39
+ /import\s+io\.cucumber/,
40
+ /import\s+org\.jbehave/,
41
+ ],
42
+ uiDriverRegex: [
43
+ /import\s+org\.openqa\.selenium/,
44
+ /import\s+org\.seleniumhq\.selenium/,
45
+ /import\s+io\.appium\.java_client/,
46
+ /import\s+com\.microsoft\.playwright/,
47
+ /import\s+com\.codeborne\.selenide/,
48
+ /import\s+net\.serenitybdd/,
49
+ /import\s+cucumber\.api\.java\.en/,
50
+ /new\s+\w*Driver\s*\(/,
51
+ /\.findElement\s*\(/,
52
+ /\.get\s*\(['"]https?:/,
53
+ /\.click\s*\(/,
54
+ /\.navigate\(\)/,
55
+ /WebDriver/,
56
+ /RemoteWebDriver/,
57
+ /ChromeDriver/,
58
+ /FirefoxDriver/,
59
+ ],
60
+ uiIndicatorRegex: [
61
+ // UI interactions without explicit driver imports
62
+ /\.sendKeys\s*\(/,
63
+ /\.getText\s*\(/,
64
+ /\.isDisplayed\s*\(/,
65
+ /By\.id\s*\(/,
66
+ /By\.className\s*\(/,
67
+ /By\.xpath\s*\(/,
68
+ /waitForElement/,
69
+ /waitForVisible/,
70
+ /assertTitle/,
71
+ /screenshot/,
72
+ /captureScreenshot/,
73
+ // Page Object patterns
74
+ /PageObject/,
75
+ /BasePage/,
76
+ /WebPage/,
77
+ // UI test annotations and patterns
78
+ /@UITest/,
79
+ /@WebTest/,
80
+ /@E2ETest/,
81
+ // Common UI assertions
82
+ /assertUrl/,
83
+ /verifyText/,
84
+ /checkElement/,
85
+ // Browser/window operations
86
+ /maximizeWindow/,
87
+ /setWindowSize/,
88
+ /switchTo/,
89
+ // Cucumber UI steps
90
+ /Given.*I\s+(open|visit|navigate)/,
91
+ /When.*I\s+(click|type|select)/,
92
+ /Then.*I\s+(see|verify|check)/,
93
+ /And.*I\s+(wait|scroll)/,
94
+ ],
95
+ backendRegex: [
96
+ /import\s+org\.springframework\.test/,
97
+ /import\s+javax\.persistence/,
98
+ /@DataJpaTest/,
99
+ /@WebMvcTest/,
100
+ /@MockBean/,
101
+ /EntityManager/,
102
+ /JdbcTemplate/,
103
+ /TestRestTemplate/,
104
+ /@Repository/,
105
+ /@Service/,
106
+ /@Entity/,
107
+ ],
108
+ excludeRegex: [
109
+ /UnitTest/,
110
+ /MockTest/,
111
+ /StubTest/,
112
+ /DatabaseTest/,
113
+ /import\s+org\.mockito/,
114
+ /@Mock\b/,
115
+ /@Spy\b/,
116
+ ],
117
+ },
118
+ csharp: {
119
+ extensions: [".cs"],
120
+ namePatterns: [
121
+ /Test\.cs$/,
122
+ /Tests\.cs$/,
123
+ /Steps\.cs$/,
124
+ /.*UI.*Test\.cs$/,
125
+ /.*Web.*Test\.cs$/,
126
+ /.*E2E.*Test\.cs$/,
127
+ ],
128
+ contentRegex: [
129
+ /\[Test\]/,
130
+ /\[TestCase\]/,
131
+ /\[Fact\]/,
132
+ /\[Theory\]/,
133
+ /\[Binding\]/,
134
+ /using\s+NUnit\.Framework/,
135
+ /using\s+Xunit/,
136
+ /using\s+TechTalk\.SpecFlow/,
137
+ ],
138
+ uiDriverRegex: [
139
+ /using\s+OpenQA\.Selenium/,
140
+ /using\s+Appium/,
141
+ /using\s+Microsoft\.Playwright/,
142
+ /using\s+Selenide/,
143
+ /using\s+Atata/,
144
+ /new\s+\w*Driver\s*\(/,
145
+ /\.FindElement\s*\(/,
146
+ /\.Navigate\(\)/,
147
+ /IWebDriver/,
148
+ /WebDriver/,
149
+ ],
150
+ uiIndicatorRegex: [
151
+ /\.SendKeys\s*\(/,
152
+ /\.Click\s*\(/,
153
+ /\.Text/,
154
+ /\.Displayed/,
155
+ /By\.Id/,
156
+ /By\.ClassName/,
157
+ /By\.XPath/,
158
+ /WaitForElement/,
159
+ /TakeScreenshot/,
160
+ /PageObject/,
161
+ /\[UITest\]/,
162
+ /\[WebTest\]/,
163
+ /\[E2ETest\]/,
164
+ /NavigateTo/,
165
+ /VerifyText/,
166
+ /AssertUrl/,
167
+ ],
168
+ backendRegex: [
169
+ /using\s+Microsoft\.EntityFrameworkCore/,
170
+ /using\s+System\.Data/,
171
+ /DbContext/,
172
+ /Repository/,
173
+ /Controller/,
174
+ /\[ApiTest\]/,
175
+ /\[DatabaseTest\]/,
176
+ ],
177
+ excludeRegex: [/\[UnitTest\]/, /Mock/, /Stub/, /using\s+Moq/],
178
+ },
179
+ nodejs: {
180
+ extensions: [".js", ".ts"],
181
+ namePatterns: [
182
+ /.test.js$/,
183
+ /.spec.js$/,
184
+ /.test.ts$/,
185
+ /.spec.ts$/,
186
+ /.*ui.*.test.(js|ts)$/,
187
+ /.*web.*.test.(js|ts)$/,
188
+ /.*e2e.*.(js|ts)$/,
189
+ /.*integration.*.test.(js|ts)$/,
190
+ ],
191
+ contentRegex: [
192
+ /\bdescribe\s*\(/,
193
+ /\bit\s*\(/,
194
+ /\btest\s*\(/,
195
+ /require\(['"]mocha['"]\)/,
196
+ /require\(['"]jest['"]\)/,
197
+ /import.*from\s+['"]jest['"]/,
198
+ /from\s+['"]@jest/,
199
+ ],
200
+ uiDriverRegex: [
201
+ /require\(['"]selenium-webdriver['"]\)/,
202
+ /require\(['"]webdriverio['"]\)/,
203
+ /require\(['"]puppeteer['"]\)/,
204
+ /require\(['"]playwright['"]\)/,
205
+ /require\(['"]cypress['"]\)/,
206
+ /require\(['"]@wdio\/sync['"]\)/,
207
+ /import.*from\s+['"]selenium-webdriver['"]/,
208
+ /import.*from\s+['"]webdriverio['"]/,
209
+ /import.*from\s+['"]puppeteer['"]/,
210
+ /import.*from\s+['"]playwright['"]/,
211
+ /import.*from\s+['"]cypress['"]/,
212
+ /import.*from\s+['"]@wdio/,
213
+ /\.launch\(/,
214
+ /\.goto\(/,
215
+ /driver\./,
216
+ /browser\./,
217
+ ],
218
+ uiIndicatorRegex: [
219
+ // Browser automation - SPECIFIC CONTEXT
220
+ /driver\.click\(/,
221
+ /driver\.type\(/,
222
+ /driver\.fill\(/,
223
+ /browser\.click\(/,
224
+ /driver\.waitForSelector\(/,
225
+ /browser\.waitForElement\(/,
226
+ /driver\.screenshot\(/,
227
+ /browser\.screenshot\(/,
228
+ /driver\.evaluate\(/,
229
+ /driver\.focus\(/,
230
+ /driver\.hover\(/,
231
+ // Page object patterns - UI specific
232
+ /page\.goto/,
233
+ /page\.click/,
234
+ /page\.fill/,
235
+ /page\.screenshot/,
236
+ /page\.waitForSelector/,
237
+ /page\.locator/,
238
+ /page\.getByRole/,
239
+ // Cypress specific patterns
240
+ /cy\.visit/,
241
+ /cy\.get/,
242
+ /cy\.click/,
243
+ /cy\.type/,
244
+ /cy\.should/,
245
+ /cy\.wait/,
246
+ /cy\.screenshot/,
247
+ /cy\.viewport/,
248
+ // WebDriverIO specific patterns
249
+ /browser\.url/,
250
+ /browser\.click/,
251
+ /browser\.setValue/,
252
+ /\$\(['"][#.]/,
253
+ /\$\$\(['"][#.]/, // CSS/XPath selectors
254
+ // Playwright specific
255
+ /expect.*toBeVisible/,
256
+ /expect.*toHaveText/,
257
+ /expect.*toBeEnabled/,
258
+ /locator\(/,
259
+ /getByText\(/,
260
+ /getByRole\(/,
261
+ /getByTestId\(/,
262
+ // DOM queries in test context
263
+ /findElement/,
264
+ /querySelector.*\)\.click/,
265
+ /getElementById.*\)\.click/,
266
+ // Test descriptions clearly indicating UI
267
+ /describe.*['"`].*UI/,
268
+ /describe.*['"`].*Web/,
269
+ /describe.*['"`].*E2E/,
270
+ /describe.*['"`].*Browser/,
271
+ /describe.*['"`].*Selenium/,
272
+ /it.*['"`].*(click|type|navigate|visit|see).*element/,
273
+ /it.*['"`].*(open|load).*page/,
274
+ /it.*['"`].*browser/,
275
+ ],
276
+ backendRegex: [
277
+ /require\(['"]express['"]\)/,
278
+ /require\(['"]fastify['"]\)/,
279
+ /require\(['"]supertest['"]\)/,
280
+ /request\(app\)/,
281
+ /mongoose/,
282
+ /sequelize/,
283
+ /prisma/,
284
+ /knex/,
285
+ /app\.get\(/,
286
+ /app\.post\(/,
287
+ /server\./,
288
+ /\.connect\(/,
289
+ /\.query\(/,
290
+ ],
291
+ excludeRegex: [
292
+ /\.unit\./,
293
+ /\.mock\./,
294
+ /jest\.mock/,
295
+ /sinon/,
296
+ /describe.*['"`]Unit/,
297
+ /describe.*['"`]Mock/,
298
+ ],
299
+ },
300
+ python: {
301
+ extensions: [".py"],
302
+ namePatterns: [
303
+ /^test_.*\.py$/,
304
+ /_test\.py$/,
305
+ /test.*ui.*\.py$/,
306
+ /test.*web.*\.py$/,
307
+ /test.*e2e.*\.py$/,
308
+ /test.*integration.*\.py$/,
309
+ ],
310
+ contentRegex: [
311
+ /import\s+pytest/,
312
+ /@pytest\.mark/,
313
+ /def\s+test_/,
314
+ /\bpytest\./,
315
+ /import\s+unittest/,
316
+ /class.*TestCase/,
317
+ ],
318
+ uiDriverRegex: [
319
+ /import\s+selenium/,
320
+ /from\s+selenium/,
321
+ /import\s+playwright/,
322
+ /from\s+playwright/,
323
+ /import\s+appium/,
324
+ /from\s+appium/,
325
+ /import\s+splinter/,
326
+ /from\s+splinter/,
327
+ /driver\s*=\s*webdriver\./,
328
+ /webdriver\.Chrome/,
329
+ /webdriver\.Firefox/,
330
+ ],
331
+ uiIndicatorRegex: [
332
+ // Selenium patterns without imports
333
+ /\.find_element/,
334
+ /\.click\(/,
335
+ /\.send_keys/,
336
+ /\.get\(/,
337
+ /\.screenshot/,
338
+ /\.execute_script/,
339
+ /\.switch_to/,
340
+ /By\.ID/,
341
+ /By\.CLASS_NAME/,
342
+ /By\.XPATH/,
343
+ // Playwright patterns
344
+ /page\.goto/,
345
+ /page\.click/,
346
+ /page\.fill/,
347
+ /page\.screenshot/,
348
+ /expect.*to_be_visible/,
349
+ /expect.*to_have_text/,
350
+ // Generic UI patterns
351
+ /WebDriverWait/,
352
+ /expected_conditions/,
353
+ /ActionChains/,
354
+ /@pytest\.mark\.ui/,
355
+ /@pytest\.mark\.web/,
356
+ /@pytest\.mark\.e2e/,
357
+ // Page object patterns
358
+ /BasePage/,
359
+ /PageObject/,
360
+ /WebPage/,
361
+ // BDD step patterns
362
+ /def\s+.*_(open|visit|navigate|click|type|see|verify)/,
363
+ ],
364
+ backendRegex: [
365
+ /import\s+flask/,
366
+ /from\s+flask/,
367
+ /import\s+fastapi/,
368
+ /from\s+fastapi/,
369
+ /import\s+django/,
370
+ /from\s+django/,
371
+ /sqlalchemy/,
372
+ /requests\.get/,
373
+ /requests\.post/,
374
+ /TestClient/,
375
+ /@pytest\.mark\.django_db/,
376
+ /django\.test/,
377
+ ],
378
+ excludeRegex: [
379
+ /unittest\.mock/,
380
+ /from\s+unittest\.mock/,
381
+ /mock\.patch/,
382
+ /@pytest\.mark\.unit/,
383
+ /@mock\./,
384
+ ],
385
+ },
386
+ ruby: {
387
+ extensions: [".rb"],
388
+ namePatterns: [
389
+ /_spec\.rb$/,
390
+ /_test\.rb$/,
391
+ /.*ui.*_spec\.rb$/,
392
+ /.*web.*_spec\.rb$/,
393
+ /.*e2e.*_spec\.rb$/,
394
+ ],
395
+ contentRegex: [
396
+ /\bdescribe\s/,
397
+ /\bit\s/,
398
+ /require\s+['"]rspec/,
399
+ /require\s+['"]minitest/,
400
+ /RSpec\.describe/,
401
+ ],
402
+ uiDriverRegex: [
403
+ /require\s+['"]selenium-webdriver['"]/,
404
+ /require\s+['"]capybara['"]/,
405
+ /require\s+['"]appium_lib['"]/,
406
+ /require\s+['"]watir['"]/,
407
+ /Selenium::WebDriver/,
408
+ /Capybara\./,
409
+ ],
410
+ uiIndicatorRegex: [
411
+ // Capybara without explicit require
412
+ /visit\s/,
413
+ /click_button/,
414
+ /click_link/,
415
+ /fill_in/,
416
+ /find\(['"]/,
417
+ /has_content/,
418
+ /page\./,
419
+ /current_path/,
420
+ // Selenium patterns
421
+ /\.find_element/,
422
+ /\.click/,
423
+ /\.send_keys/,
424
+ // Generic UI patterns
425
+ /screenshot/,
426
+ /driver\./,
427
+ /browser\./,
428
+ /feature\s+['"]/,
429
+ /scenario\s+['"]/,
430
+ /expect.*to\s+have_content/,
431
+ /expect.*to\s+have_selector/,
432
+ ],
433
+ backendRegex: [
434
+ /require\s+['"]sinatra['"]/,
435
+ /require\s+['"]rails['"]/,
436
+ /ActiveRecord/,
437
+ /DatabaseCleaner/,
438
+ /FactoryBot/,
439
+ ],
440
+ excludeRegex: [
441
+ /double\(/,
442
+ /instance_double/,
443
+ /class_double/,
444
+ /allow\(.*\)\.to\s+receive/,
445
+ /mock/i,
446
+ ],
447
+ },
448
+ };
449
+ export const EXCLUDED_DIRS = new Set([
450
+ "node_modules",
451
+ ".venv",
452
+ "venv",
453
+ "__pycache__",
454
+ "site-packages",
455
+ "dist",
456
+ "build",
457
+ ".git",
458
+ ".mypy_cache",
459
+ ".pytest_cache",
460
+ ".tox",
461
+ ".idea",
462
+ ".vscode",
463
+ "coverage",
464
+ ".nyc_output",
465
+ "target",
466
+ "bin",
467
+ "obj",
468
+ "packages",
469
+ ".nuget",
470
+ ]);
471
+ export const backendIndicators = [
472
+ /import\s+requests/,
473
+ /requests\.(get|post|put|delete|patch)/,
474
+ /@pytest\.mark\.(api|backend|integration)/,
475
+ /BASE_URL\s*=/,
476
+ /\.status_code/,
477
+ /\.json\(\)/,
478
+ /TestClient/,
479
+ /Bearer\s+/,
480
+ /Authorization.*Bearer/,
481
+ ];
482
+ export const strongUIIndicators = [
483
+ // Browser automation with specific context
484
+ /(driver|browser|page)\.(click|type|fill|screenshot|wait)/,
485
+ /webdriver\.(Chrome|Firefox|Safari|Edge)/,
486
+ /(selenium|playwright|puppeteer|cypress).*import/,
487
+ // CSS/XPath selectors
488
+ /By\.(ID|CLASS_NAME|XPATH|CSS_SELECTOR)/,
489
+ /\$\(['"#[.][^'"]*['"]\)/, // $(".class") or $("#id")
490
+ // Page Object Model
491
+ /class.*Page.*:/,
492
+ /class.*PageObject/,
493
+ // UI test markers
494
+ /@(ui|web|e2e|browser)_?test/,
495
+ /@pytest\.mark\.(ui|web|e2e|browser)/,
496
+ // Browser navigation
497
+ /\.goto\s*\(['"]https?:/,
498
+ /\.visit\s*\(['"]https?:/,
499
+ /\.navigate\(\)\.to\(/,
500
+ ];
@@ -0,0 +1,10 @@
1
+ import { SDKSupportedLanguage, SDKSupportedTestingFrameworkEnum } from "../sdk-utils/common/types.js";
2
+ export interface ListTestFilesOptions {
3
+ language: SDKSupportedLanguage;
4
+ framework?: SDKSupportedTestingFrameworkEnum;
5
+ baseDir: string;
6
+ strictMode?: boolean;
7
+ }
8
+ export declare function listTestFiles(options: ListTestFilesOptions): Promise<string[]>;
9
+ export declare function listUITestFilesStrict(options: Omit<ListTestFilesOptions, "strictMode">): Promise<string[]>;
10
+ export declare function listUITestFilesRelaxed(options: Omit<ListTestFilesOptions, "strictMode">): Promise<string[]>;