@skyramp/mcp 0.3.2-rc.pom-3 → 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.
Files changed (289) hide show
  1. package/build/commands/commandLibrary.d.ts +1 -0
  2. package/build/commands/commandLibrary.js +19 -13
  3. package/build/commands/localDevTestChangesCommand.d.ts +15 -0
  4. package/build/commands/localDevTestChangesCommand.js +201 -0
  5. package/build/index.js +80 -6
  6. package/build/prompts/code-reuse.js +3 -0
  7. package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +1 -0
  8. package/build/prompts/enhance-assertions/sharedAssertionRules.js +17 -0
  9. package/build/prompts/initialize-workspace/initializeWorkspacePrompt.js +11 -9
  10. package/build/prompts/local-dev/local-dev-plan.d.ts +35 -0
  11. package/build/prompts/local-dev/local-dev-plan.js +429 -0
  12. package/build/prompts/local-dev/local-dev-prompts.d.ts +4 -0
  13. package/build/prompts/local-dev/local-dev-prompts.js +190 -0
  14. package/build/prompts/pom-aware-code-reuse.js +12 -0
  15. package/build/prompts/prompt-utils.d.ts +8 -0
  16. package/build/prompts/prompt-utils.js +33 -0
  17. package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +37 -14
  18. package/build/prompts/sut-setup/shared.js +16 -12
  19. package/build/prompts/test-recommendation/analysisOutputPrompt.js +21 -29
  20. package/build/prompts/test-recommendation/scopeAssessment.d.ts +24 -7
  21. package/build/prompts/test-recommendation/scopeAssessment.js +111 -12
  22. package/build/prompts/test-recommendation/test-recommendation-prompt.js +41 -4
  23. package/build/prompts/testbot/testbot-prompts.d.ts +0 -5
  24. package/build/prompts/testbot/testbot-prompts.js +32 -52
  25. package/build/recommendation/planRanker.d.ts +15 -2
  26. package/build/recommendation/planRanker.js +76 -5
  27. package/build/resources/testbotResource.js +2 -1
  28. package/build/services/AnalyticsService.d.ts +1 -1
  29. package/build/services/TestExecutionService.d.ts +2 -1
  30. package/build/services/TestExecutionService.js +8 -3
  31. package/build/services/TestGenerationService.d.ts +2 -2
  32. package/build/services/TestGenerationService.js +39 -21
  33. package/build/services/containerEnv.js +3 -1
  34. package/build/tool-phases.js +6 -0
  35. package/build/tools/code-refactor/codeReuseTool.js +43 -4
  36. package/build/tools/code-refactor/enhanceAssertionsTool.js +68 -18
  37. package/build/tools/code-refactor/reuse-outcome.d.ts +109 -0
  38. package/build/tools/code-refactor/reuse-outcome.js +158 -0
  39. package/build/tools/code-refactor/reuse-state.d.ts +45 -0
  40. package/build/tools/code-refactor/reuse-state.js +140 -0
  41. package/build/tools/enrichTestWithMocksTool.d.ts +28 -0
  42. package/build/tools/enrichTestWithMocksTool.js +726 -0
  43. package/build/tools/executeSkyrampTestTool.d.ts +11 -0
  44. package/build/tools/executeSkyrampTestTool.js +62 -21
  45. package/build/tools/generate-tests/batchMockGenerationTool.d.ts +106 -0
  46. package/build/tools/generate-tests/batchMockGenerationTool.js +545 -0
  47. package/build/tools/generate-tests/generateBatchScenarioRestTool.js +25 -23
  48. package/build/tools/generate-tests/generateContractRestTool.js +2 -2
  49. package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -1
  50. package/build/tools/generate-tests/generateE2ERestTool.js +1 -1
  51. package/build/tools/generate-tests/generateLoadRestTool.d.ts +1 -1
  52. package/build/tools/generate-tests/generateLoadRestTool.js +1 -1
  53. package/build/tools/generate-tests/generateMockRestTool.d.ts +179 -6
  54. package/build/tools/generate-tests/generateMockRestTool.js +391 -22
  55. package/build/tools/generate-tests/loadTestSchema.d.ts +1 -1
  56. package/build/tools/generate-tests/planGuard.js +2 -22
  57. package/build/tools/generateEnrichedIntegrationTestTool.d.ts +25 -0
  58. package/build/tools/generateEnrichedIntegrationTestTool.js +235 -0
  59. package/build/tools/localDevWorkerComposeTool.d.ts +24 -0
  60. package/build/tools/localDevWorkerComposeTool.js +264 -0
  61. package/build/tools/one-click/oneClickTool.d.ts +13 -0
  62. package/build/tools/one-click/oneClickTool.js +195 -24
  63. package/build/tools/preflightMockCheckTool.d.ts +2 -0
  64. package/build/tools/preflightMockCheckTool.js +96 -0
  65. package/build/tools/queryProxyMocksTool.d.ts +70 -0
  66. package/build/tools/queryProxyMocksTool.js +522 -0
  67. package/build/tools/runExistingTestsTool.d.ts +31 -0
  68. package/build/tools/runExistingTestsTool.js +214 -13
  69. package/build/tools/submitReportTool.js +38 -3
  70. package/build/tools/test-management/analyzeChangesTool.d.ts +2 -1
  71. package/build/tools/test-management/analyzeChangesTool.js +63 -40
  72. package/build/tools/test-management/registerTestPlanTool.js +55 -7
  73. package/build/tools/trace/startTraceCollectionTool.js +3 -3
  74. package/build/types/FrontendIntegration.d.ts +3 -0
  75. package/build/types/FrontendIntegration.js +3 -0
  76. package/build/types/OneClickCommands.d.ts +1 -1
  77. package/build/types/Recommendation.d.ts +20 -0
  78. package/build/types/Recommendation.js +32 -6
  79. package/build/types/RepositoryAnalysis.d.ts +131 -14
  80. package/build/types/RepositoryAnalysis.js +16 -2
  81. package/build/types/ReuseOutcome.d.ts +63 -0
  82. package/build/types/ReuseOutcome.js +33 -0
  83. package/build/types/TestExecution.d.ts +1 -0
  84. package/build/types/TestTypes.d.ts +25 -7
  85. package/build/types/TestTypes.js +22 -6
  86. package/build/types/TestbotReport.d.ts +7 -0
  87. package/build/types/index.d.ts +2 -0
  88. package/build/types/index.js +1 -0
  89. package/build/utils/AnalysisStateManager.d.ts +26 -0
  90. package/build/utils/AnalysisStateManager.js +31 -1
  91. package/build/utils/analyze-openapi.js +18 -1
  92. package/build/utils/branchDiff.d.ts +17 -1
  93. package/build/utils/branchDiff.js +99 -14
  94. package/build/utils/featureFlags.d.ts +31 -0
  95. package/build/utils/featureFlags.js +37 -0
  96. package/build/utils/frontendIntegration.js +8 -1
  97. package/build/utils/grpcMockValidation.d.ts +1 -0
  98. package/build/utils/grpcMockValidation.js +49 -0
  99. package/build/utils/httpMethodValidation.d.ts +4 -0
  100. package/build/utils/httpMethodValidation.js +15 -0
  101. package/build/utils/logger.js +1 -1
  102. package/build/utils/mockCompatibility.d.ts +49 -0
  103. package/build/utils/mockCompatibility.js +82 -0
  104. package/build/utils/pom-scope/pom-files.js +7 -0
  105. package/build/utils/pom-verify/bindings.js +11 -1
  106. package/build/utils/pom-verify/re-exports.d.ts +10 -0
  107. package/build/utils/pom-verify/re-exports.js +61 -0
  108. package/build/utils/pom-verify/resolve.d.ts +4 -1
  109. package/build/utils/pom-verify/resolve.js +7 -4
  110. package/build/utils/pom-verify/verify.d.ts +5 -0
  111. package/build/utils/pom-verify/verify.js +25 -3
  112. package/build/utils/progress.js +10 -5
  113. package/build/utils/proxy-terminal.js +3 -3
  114. package/build/utils/routeParsers.d.ts +3 -9
  115. package/build/utils/routeParsers.js +79 -4
  116. package/build/utils/utils.js +2 -2
  117. package/build/utils/versions.d.ts +4 -3
  118. package/build/utils/versions.js +3 -1
  119. package/build/utils/workspaceAuth.d.ts +46 -0
  120. package/build/utils/workspaceAuth.js +156 -1
  121. package/build/workspace/testSuites.d.ts +2 -1
  122. package/build/workspace/testSuites.js +1 -1
  123. package/build/workspace/workspace.d.ts +108 -32
  124. package/build/workspace/workspace.js +32 -4
  125. package/package.json +5 -2
  126. package/build/adapters/jestAdapter.test.d.ts +0 -1
  127. package/build/adapters/jestAdapter.test.js +0 -93
  128. package/build/adapters/mochaAdapter.test.d.ts +0 -1
  129. package/build/adapters/mochaAdapter.test.js +0 -63
  130. package/build/adapters/playwrightAdapter.test.d.ts +0 -1
  131. package/build/adapters/playwrightAdapter.test.js +0 -169
  132. package/build/adapters/pytestAdapter.test.d.ts +0 -1
  133. package/build/adapters/pytestAdapter.test.js +0 -90
  134. package/build/prompts/code-reuse.test.d.ts +0 -1
  135. package/build/prompts/code-reuse.test.js +0 -62
  136. package/build/prompts/pom-aware-code-reuse.test.d.ts +0 -1
  137. package/build/prompts/pom-aware-code-reuse.test.js +0 -11
  138. package/build/prompts/test-maintenance/drift-analysis-prompt.test.d.ts +0 -1
  139. package/build/prompts/test-maintenance/drift-analysis-prompt.test.js +0 -51
  140. package/build/prompts/test-recommendation/analysisOutputPrompt.test.d.ts +0 -1
  141. package/build/prompts/test-recommendation/analysisOutputPrompt.test.js +0 -264
  142. package/build/prompts/test-recommendation/mergeEnrichedScenarios.test.d.ts +0 -1
  143. package/build/prompts/test-recommendation/mergeEnrichedScenarios.test.js +0 -126
  144. package/build/prompts/test-recommendation/promptPlan.test.d.ts +0 -1
  145. package/build/prompts/test-recommendation/promptPlan.test.js +0 -336
  146. package/build/prompts/test-recommendation/scopeAssessment.test.d.ts +0 -1
  147. package/build/prompts/test-recommendation/scopeAssessment.test.js +0 -371
  148. package/build/prompts/test-recommendation/test-recommendation-prompt.test.d.ts +0 -1
  149. package/build/prompts/test-recommendation/test-recommendation-prompt.test.js +0 -1925
  150. package/build/prompts/testbot/testbot-prompts.test.d.ts +0 -1
  151. package/build/prompts/testbot/testbot-prompts.test.js +0 -451
  152. package/build/recommendation/budgeters/diversityBalancedBudgeter.test.d.ts +0 -1
  153. package/build/recommendation/budgeters/diversityBalancedBudgeter.test.js +0 -138
  154. package/build/recommendation/budgeters/fixedNBudgeter.test.d.ts +0 -1
  155. package/build/recommendation/budgeters/fixedNBudgeter.test.js +0 -66
  156. package/build/recommendation/discriminators.test.d.ts +0 -1
  157. package/build/recommendation/discriminators.test.js +0 -324
  158. package/build/recommendation/diversity.test.d.ts +0 -1
  159. package/build/recommendation/diversity.test.js +0 -77
  160. package/build/recommendation/planRanker.test.d.ts +0 -1
  161. package/build/recommendation/planRanker.test.js +0 -110
  162. package/build/resources/testbotResource.test.d.ts +0 -1
  163. package/build/resources/testbotResource.test.js +0 -44
  164. package/build/services/AnalyticsService.test.d.ts +0 -1
  165. package/build/services/AnalyticsService.test.js +0 -86
  166. package/build/services/ScenarioGenerationService.integration.test.d.ts +0 -1
  167. package/build/services/ScenarioGenerationService.integration.test.js +0 -162
  168. package/build/services/ScenarioGenerationService.test.d.ts +0 -1
  169. package/build/services/ScenarioGenerationService.test.js +0 -414
  170. package/build/services/TestDiscoveryService.test.d.ts +0 -1
  171. package/build/services/TestDiscoveryService.test.js +0 -983
  172. package/build/services/TestExecutionService.test.d.ts +0 -1
  173. package/build/services/TestExecutionService.test.js +0 -1032
  174. package/build/services/TestGenerationService.test.d.ts +0 -1
  175. package/build/services/TestGenerationService.test.js +0 -578
  176. package/build/tool-phase-coverage.test.d.ts +0 -1
  177. package/build/tool-phase-coverage.test.js +0 -49
  178. package/build/tools/code-refactor/codeReuseTool.test.d.ts +0 -1
  179. package/build/tools/code-refactor/codeReuseTool.test.js +0 -572
  180. package/build/tools/generate-tests/generateBatchScenarioRestTool.test.d.ts +0 -1
  181. package/build/tools/generate-tests/generateBatchScenarioRestTool.test.js +0 -433
  182. package/build/tools/generate-tests/generateContractRestTool.test.d.ts +0 -1
  183. package/build/tools/generate-tests/generateContractRestTool.test.js +0 -142
  184. package/build/tools/generate-tests/generateIntegrationRestTool.test.d.ts +0 -1
  185. package/build/tools/generate-tests/generateIntegrationRestTool.test.js +0 -159
  186. package/build/tools/generate-tests/generateLoadRestTool.test.d.ts +0 -1
  187. package/build/tools/generate-tests/generateLoadRestTool.test.js +0 -169
  188. package/build/tools/generate-tests/generateUIRestTool.test.d.ts +0 -1
  189. package/build/tools/generate-tests/generateUIRestTool.test.js +0 -32
  190. package/build/tools/generate-tests/planGuard.test.d.ts +0 -1
  191. package/build/tools/generate-tests/planGuard.test.js +0 -185
  192. package/build/tools/generate-tests/scenarioLint.test.d.ts +0 -1
  193. package/build/tools/generate-tests/scenarioLint.test.js +0 -100
  194. package/build/tools/runExistingTestsTool.test.d.ts +0 -1
  195. package/build/tools/runExistingTestsTool.test.js +0 -379
  196. package/build/tools/submitReportTool.test.d.ts +0 -1
  197. package/build/tools/submitReportTool.test.js +0 -1428
  198. package/build/tools/test-management/actionsTool.test.d.ts +0 -1
  199. package/build/tools/test-management/actionsTool.test.js +0 -436
  200. package/build/tools/test-management/analyzeChangesTool.test.d.ts +0 -1
  201. package/build/tools/test-management/analyzeChangesTool.test.js +0 -522
  202. package/build/tools/test-management/analyzeTestHealthTool.test.d.ts +0 -1
  203. package/build/tools/test-management/analyzeTestHealthTool.test.js +0 -385
  204. package/build/tools/test-management/registerTestPlanTool.test.d.ts +0 -1
  205. package/build/tools/test-management/registerTestPlanTool.test.js +0 -296
  206. package/build/tools/trace/resolveSaveStoragePath.test.d.ts +0 -1
  207. package/build/tools/trace/resolveSaveStoragePath.test.js +0 -17
  208. package/build/tools/trace/resolveSessionPaths.test.d.ts +0 -1
  209. package/build/tools/trace/resolveSessionPaths.test.js +0 -104
  210. package/build/tools/trace/sessionState.test.d.ts +0 -1
  211. package/build/tools/trace/sessionState.test.js +0 -17
  212. package/build/tools/workspace/initializeWorkspaceTool.test.d.ts +0 -1
  213. package/build/tools/workspace/initializeWorkspaceTool.test.js +0 -139
  214. package/build/tools/workspace/serviceUpsert.test.d.ts +0 -1
  215. package/build/tools/workspace/serviceUpsert.test.js +0 -50
  216. package/build/utils/AnalysisStateManager.test.d.ts +0 -1
  217. package/build/utils/AnalysisStateManager.test.js +0 -134
  218. package/build/utils/dartRouteExtractor.test.d.ts +0 -1
  219. package/build/utils/dartRouteExtractor.test.js +0 -307
  220. package/build/utils/docker.test.d.ts +0 -1
  221. package/build/utils/docker.test.js +0 -114
  222. package/build/utils/featureFlags.test.d.ts +0 -1
  223. package/build/utils/featureFlags.test.js +0 -81
  224. package/build/utils/fileWalk.test.d.ts +0 -1
  225. package/build/utils/fileWalk.test.js +0 -252
  226. package/build/utils/frontendIntegration.test.d.ts +0 -1
  227. package/build/utils/frontendIntegration.test.js +0 -229
  228. package/build/utils/frontendSelectors.test.d.ts +0 -1
  229. package/build/utils/frontendSelectors.test.js +0 -118
  230. package/build/utils/gitStaging.test.d.ts +0 -1
  231. package/build/utils/gitStaging.test.js +0 -111
  232. package/build/utils/httpDefaults.test.d.ts +0 -1
  233. package/build/utils/httpDefaults.test.js +0 -21
  234. package/build/utils/importerHop.test.d.ts +0 -1
  235. package/build/utils/importerHop.test.js +0 -469
  236. package/build/utils/pathAffinityClassification.test.d.ts +0 -1
  237. package/build/utils/pathAffinityClassification.test.js +0 -208
  238. package/build/utils/planMatchKeys.test.d.ts +0 -1
  239. package/build/utils/planMatchKeys.test.js +0 -123
  240. package/build/utils/pom-scope/index.test.d.ts +0 -1
  241. package/build/utils/pom-scope/index.test.js +0 -278
  242. package/build/utils/pom-scope/pom-files.test.d.ts +0 -1
  243. package/build/utils/pom-scope/pom-files.test.js +0 -29
  244. package/build/utils/pom-scope/scoring.test.d.ts +0 -1
  245. package/build/utils/pom-scope/scoring.test.js +0 -39
  246. package/build/utils/pom-scope/selector-extractor.test.d.ts +0 -1
  247. package/build/utils/pom-scope/selector-extractor.test.js +0 -67
  248. package/build/utils/pom-verify/bindings.test.d.ts +0 -1
  249. package/build/utils/pom-verify/bindings.test.js +0 -164
  250. package/build/utils/pom-verify/calls.test.d.ts +0 -1
  251. package/build/utils/pom-verify/calls.test.js +0 -61
  252. package/build/utils/pom-verify/resolve.test.d.ts +0 -1
  253. package/build/utils/pom-verify/resolve.test.js +0 -114
  254. package/build/utils/pom-verify/verify.test.d.ts +0 -1
  255. package/build/utils/pom-verify/verify.test.js +0 -374
  256. package/build/utils/pr-comment-parser.test.d.ts +0 -1
  257. package/build/utils/pr-comment-parser.test.js +0 -428
  258. package/build/utils/progress.test.d.ts +0 -1
  259. package/build/utils/progress.test.js +0 -37
  260. package/build/utils/projectMetadata.test.d.ts +0 -1
  261. package/build/utils/projectMetadata.test.js +0 -172
  262. package/build/utils/pythonMountPrefixes.test.d.ts +0 -1
  263. package/build/utils/pythonMountPrefixes.test.js +0 -113
  264. package/build/utils/repoScanner.test.d.ts +0 -1
  265. package/build/utils/repoScanner.test.js +0 -190
  266. package/build/utils/reportVerification.test.d.ts +0 -1
  267. package/build/utils/reportVerification.test.js +0 -185
  268. package/build/utils/routeParsers.test.d.ts +0 -1
  269. package/build/utils/routeParsers.test.js +0 -1011
  270. package/build/utils/scenarioDrafting.test.d.ts +0 -1
  271. package/build/utils/scenarioDrafting.test.js +0 -876
  272. package/build/utils/sourceRouteExtractor.test.d.ts +0 -1
  273. package/build/utils/sourceRouteExtractor.test.js +0 -738
  274. package/build/utils/telemetry.test.d.ts +0 -1
  275. package/build/utils/telemetry.test.js +0 -70
  276. package/build/utils/trace-parser.test.d.ts +0 -6
  277. package/build/utils/trace-parser.test.js +0 -140
  278. package/build/utils/uiPageEnumerator.test.d.ts +0 -1
  279. package/build/utils/uiPageEnumerator.test.js +0 -824
  280. package/build/utils/utils.test.d.ts +0 -1
  281. package/build/utils/utils.test.js +0 -103
  282. package/build/utils/walkerCharacterization.test.d.ts +0 -1
  283. package/build/utils/walkerCharacterization.test.js +0 -233
  284. package/build/utils/workspaceAuth.test.d.ts +0 -1
  285. package/build/utils/workspaceAuth.test.js +0 -260
  286. package/build/workspace/testSuites.test.d.ts +0 -1
  287. package/build/workspace/testSuites.test.js +0 -23
  288. package/build/workspace/workspace.test.d.ts +0 -1
  289. package/build/workspace/workspace.test.js +0 -264
@@ -1,63 +0,0 @@
1
- import path from "path";
2
- import { fileURLToPath } from "url";
3
- import { readFileSync } from "fs";
4
- import { parseMochaJson, buildMochaArgs } from "./mochaAdapter.js";
5
- const here = path.dirname(fileURLToPath(import.meta.url));
6
- function loadFixture(name) {
7
- return JSON.parse(readFileSync(path.join(here, "__fixtures__", `mocha-${name}.json`), "utf8"));
8
- }
9
- describe("parseMochaJson", () => {
10
- const parsed = parseMochaJson(loadFixture("healthy"));
11
- const byId = (s) => parsed.results.find((r) => r.testId.includes(s));
12
- it("keeps the environment healthy for a normal run", () => {
13
- expect(parsed.environmentHealthy).toBe(true);
14
- });
15
- it("maps passes/pending/assertion-failure/hook-error to pass/skipped/fail/error", () => {
16
- expect(byId("math adds").status).toBe("pass");
17
- expect(byId("math later").status).toBe("skipped");
18
- expect(byId("detects regression").status).toBe("fail");
19
- expect(byId("before each").status).toBe("error");
20
- });
21
- it("builds testId from file + fullTitle", () => {
22
- expect(byId("math adds").testId).toBe("/repo/test/math.spec.js › math adds");
23
- expect(byId("math adds").file).toBe("/repo/test/math.spec.js");
24
- });
25
- it("captures a message for fail and error", () => {
26
- expect(byId("detects regression").message).toMatch(/expected 2 to equal 3/);
27
- expect(byId("before each").message).toMatch(/Cannot read properties/);
28
- });
29
- it("summarizes ran/failed/errored/skipped (skipped not in ran)", () => {
30
- expect(parsed.summary).toMatchObject({ failed: 1, errored: 1, skipped: 1 });
31
- expect(parsed.summary.ran).toBe(3);
32
- });
33
- it("classifies an assertion failure in a test merely titled with 'hook' as fail, not error", () => {
34
- const parsed = parseMochaJson({
35
- failures: [
36
- {
37
- title: "renders the hook menu",
38
- fullTitle: "ui renders the hook menu",
39
- file: "/repo/test/ui.spec.js",
40
- duration: 2,
41
- err: { name: "AssertionError", message: "expected menu open" },
42
- },
43
- ],
44
- });
45
- expect(parsed.results[0].status).toBe("fail");
46
- });
47
- });
48
- describe("buildMochaArgs", () => {
49
- it("forces the json reporter (to stdout) and passes files", () => {
50
- const args = buildMochaArgs({ selectors: ["test/math.spec.js"], mode: "confirm" });
51
- expect(args).toContain("--reporter");
52
- expect(args).toContain("json");
53
- expect(args).toContain("test/math.spec.js");
54
- expect(args).not.toContain("--bail");
55
- });
56
- it("bails in probe mode and filters by name via --grep", () => {
57
- const args = buildMochaArgs({ selectors: ["test/math.spec.js::adds"], mode: "probe" });
58
- expect(args).toContain("--bail");
59
- const gi = args.indexOf("--grep");
60
- expect(gi).toBeGreaterThanOrEqual(0);
61
- expect(args[gi + 1]).toContain("adds");
62
- });
63
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,169 +0,0 @@
1
- import path from "path";
2
- import { fileURLToPath } from "url";
3
- import { readFileSync } from "fs";
4
- import { parsePlaywrightJson, buildPlaywrightArgs } from "./playwrightAdapter.js";
5
- const here = path.dirname(fileURLToPath(import.meta.url));
6
- /** Loads a fixture captured from a real `@playwright/test` JSON reporter run. */
7
- function loadFixture(name) {
8
- return JSON.parse(readFileSync(path.join(here, "__fixtures__", `playwright-${name}.json`), "utf8"));
9
- }
10
- describe("parsePlaywrightJson", () => {
11
- describe("healthy variety report", () => {
12
- const parsed = parsePlaywrightJson(loadFixture("healthy"));
13
- const byTitle = (t) => parsed.results.find((r) => r.testId.includes(t));
14
- it("reports the environment as healthy", () => {
15
- expect(parsed.environmentHealthy).toBe(true);
16
- expect(parsed.healthDetail).toBeUndefined();
17
- });
18
- it("maps passed/failed/timedOut/skipped to pass/fail/error/skipped", () => {
19
- expect(byTitle("adds numbers").status).toBe("pass");
20
- expect(byTitle("detects a regression").status).toBe("fail");
21
- expect(byTitle("hangs past timeout").status).toBe("error");
22
- expect(byTitle("skipped feature").status).toBe("skipped");
23
- });
24
- it("includes describe-block titles in the testId", () => {
25
- const nested = byTitle("nested passing case");
26
- expect(nested.testId).toContain("nested group");
27
- expect(nested.status).toBe("pass");
28
- });
29
- it("anchors each result to its spec file", () => {
30
- expect(byTitle("adds numbers").file).toBe("sample.test.ts");
31
- });
32
- it("captures a failure message for failed tests", () => {
33
- const fail = byTitle("detects a regression");
34
- expect(fail.message && fail.message.length).toBeGreaterThan(0);
35
- });
36
- it("summarizes ran/failed/errored/skipped counts (skipped is not 'ran')", () => {
37
- expect(parsed.summary).toMatchObject({
38
- failed: 2,
39
- errored: 1,
40
- skipped: 1,
41
- truncated: false,
42
- });
43
- expect(parsed.summary.ran).toBe(5);
44
- });
45
- it("records duration in milliseconds", () => {
46
- expect(byTitle("hangs past timeout").durationMs).toBeGreaterThan(900);
47
- });
48
- });
49
- describe("global-setup failure", () => {
50
- const parsed = parsePlaywrightJson(loadFixture("setup-failure"));
51
- it("marks the environment unhealthy (a wall of skips is not PR signal)", () => {
52
- expect(parsed.environmentHealthy).toBe(false);
53
- expect(parsed.healthDetail).toBeTruthy();
54
- });
55
- it("excludes setup-project specs from the reported results", () => {
56
- expect(parsed.results.some((r) => r.testId.includes("bring up environment"))).toBe(false);
57
- });
58
- it("does not count setup-skipped tests as ran or failed", () => {
59
- expect(parsed.summary.ran).toBe(0);
60
- expect(parsed.summary.failed).toBe(0);
61
- });
62
- });
63
- describe("collection error (import/config failure)", () => {
64
- const parsed = parsePlaywrightJson(loadFixture("collection-error"));
65
- it("marks the environment unhealthy when top-level errors are present", () => {
66
- expect(parsed.environmentHealthy).toBe(false);
67
- expect(parsed.healthDetail).toBeTruthy();
68
- });
69
- it("produces no test results", () => {
70
- expect(parsed.results).toHaveLength(0);
71
- });
72
- });
73
- it("honors an explicit truncated flag", () => {
74
- const parsed = parsePlaywrightJson(loadFixture("healthy"), { truncated: true });
75
- expect(parsed.summary.truncated).toBe(true);
76
- });
77
- describe("diagnostics", () => {
78
- it("reports an empty, healthy diagnostics shape for a clean run", () => {
79
- const parsed = parsePlaywrightJson({ suites: [] });
80
- expect(parsed.diagnostics).toEqual({
81
- runLevelErrors: [],
82
- infraSpecFailed: false,
83
- maxFailuresBail: false,
84
- });
85
- });
86
- it("flags a --max-failures bail as benign (not an infra failure)", () => {
87
- const parsed = parsePlaywrightJson({
88
- suites: [],
89
- errors: [
90
- { message: "Testing stopped early after 1 maximum allowed failures." },
91
- ],
92
- });
93
- expect(parsed.diagnostics?.maxFailuresBail).toBe(true);
94
- expect(parsed.diagnostics?.runLevelErrors).toContain("Testing stopped early after 1 maximum allowed failures.");
95
- expect(parsed.diagnostics?.infraSpecFailed).toBe(false);
96
- // A bail is a product-test failure, not an environment failure — it must
97
- // not flip environmentHealthy, or downstream logic would discard the run.
98
- expect(parsed.environmentHealthy).toBe(true);
99
- expect(parsed.healthDetail).toBeUndefined();
100
- });
101
- it("flags infraSpecFailed when a global-setup spec fails", () => {
102
- const parsed = parsePlaywrightJson(loadFixture("setup-failure"));
103
- expect(parsed.diagnostics?.infraSpecFailed).toBe(true);
104
- expect(parsed.diagnostics?.maxFailuresBail).toBe(false);
105
- });
106
- it("surfaces the infra-spec cause over a coincident --max-failures bail", () => {
107
- // In probe mode a failing global-setup makes Playwright report BOTH the
108
- // failed setup spec AND a "stopped early" run-level bail. The healthDetail
109
- // must name the setup failure — the actionable cause — not the benign bail.
110
- const parsed = parsePlaywrightJson({
111
- errors: [
112
- { message: "Testing stopped early after 1 maximum allowed failures." },
113
- ],
114
- suites: [
115
- {
116
- title: "global.setup.ts",
117
- file: "tests/global.setup.ts",
118
- specs: [
119
- {
120
- title: "global environment setup",
121
- tests: [
122
- {
123
- projectName: "global-setup",
124
- results: [{ status: "failed", duration: 5 }],
125
- },
126
- ],
127
- },
128
- ],
129
- },
130
- ],
131
- });
132
- expect(parsed.diagnostics?.infraSpecFailed).toBe(true);
133
- expect(parsed.diagnostics?.maxFailuresBail).toBe(true);
134
- expect(parsed.environmentHealthy).toBe(false);
135
- expect(parsed.healthDetail).toContain("Environment setup failed");
136
- expect(parsed.healthDetail).toContain("global.setup.ts");
137
- expect(parsed.healthDetail).not.toContain("stopped early");
138
- });
139
- });
140
- });
141
- describe("buildPlaywrightArgs", () => {
142
- it("appends the JSON reporter and disables the failure cap in confirm mode", () => {
143
- const args = buildPlaywrightArgs({
144
- selectors: ["tests/a.test.ts"],
145
- mode: "confirm",
146
- });
147
- expect(args).toContain("--reporter=json");
148
- expect(args).toContain("--max-failures=0");
149
- expect(args).toContain("tests/a.test.ts");
150
- });
151
- it("passes a title filter via --grep when a selector names a test", () => {
152
- const args = buildPlaywrightArgs({
153
- selectors: ["tests/a.test.ts::renders header"],
154
- mode: "confirm",
155
- });
156
- const gi = args.indexOf("--grep");
157
- expect(gi).toBeGreaterThanOrEqual(0);
158
- expect(args[gi + 1]).toContain("renders header");
159
- expect(args).toContain("tests/a.test.ts");
160
- });
161
- it("adds --project when a project is given", () => {
162
- const args = buildPlaywrightArgs({
163
- selectors: ["tests/a.test.ts"],
164
- mode: "confirm",
165
- project: "main",
166
- });
167
- expect(args).toContain("--project=main");
168
- });
169
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,90 +0,0 @@
1
- import path from "path";
2
- import { fileURLToPath } from "url";
3
- import { readFileSync } from "fs";
4
- import { parsePytestJson, buildPytestArgs } from "./pytestAdapter.js";
5
- const here = path.dirname(fileURLToPath(import.meta.url));
6
- function loadFixture(name) {
7
- return JSON.parse(readFileSync(path.join(here, "__fixtures__", `pytest-${name}.json`), "utf8"));
8
- }
9
- describe("parsePytestJson", () => {
10
- describe("healthy variety report", () => {
11
- const parsed = parsePytestJson(loadFixture("healthy"));
12
- const byId = (s) => parsed.results.find((r) => r.testId.includes(s));
13
- it("reports the environment as healthy", () => {
14
- expect(parsed.environmentHealthy).toBe(true);
15
- expect(parsed.healthDetail).toBeUndefined();
16
- });
17
- it("maps passed/failed/error/skipped natively, keeping fail vs error distinct", () => {
18
- expect(byId("test_adds").status).toBe("pass");
19
- expect(byId("test_regression").status).toBe("fail");
20
- expect(byId("test_needs_fixture").status).toBe("error");
21
- expect(byId("test_future").status).toBe("skipped");
22
- });
23
- it("uses the real nodeid as testId and the file segment before :: as file", () => {
24
- expect(byId("test_adds").testId).toBe("tests/test_math.py::test_adds");
25
- expect(byId("test_adds").file).toBe("tests/test_math.py");
26
- expect(byId("test_needs_fixture").file).toBe("tests/test_db.py");
27
- });
28
- it("captures a message for fail and error (from longrepr)", () => {
29
- expect(byId("test_regression").message.length).toBeGreaterThan(0);
30
- expect(byId("test_needs_fixture").message).toMatch(/db not up/);
31
- });
32
- it("summarizes ran/failed/errored/skipped (skipped not counted in ran)", () => {
33
- expect(parsed.summary).toMatchObject({ failed: 1, errored: 1, skipped: 1 });
34
- expect(parsed.summary.ran).toBe(3);
35
- });
36
- it("records duration in milliseconds", () => {
37
- expect(byId("test_adds").durationMs).toBe(12);
38
- });
39
- });
40
- describe("collection error (whole suite uncollectable)", () => {
41
- const parsed = parsePytestJson(loadFixture("collection-error"));
42
- it("marks the environment unhealthy when no test could run", () => {
43
- expect(parsed.environmentHealthy).toBe(false);
44
- expect(parsed.healthDetail).toBeTruthy();
45
- });
46
- it("surfaces the collection error as an errored result (not dropped)", () => {
47
- expect(parsed.results).toHaveLength(1);
48
- expect(parsed.results[0].status).toBe("error");
49
- expect(parsed.results[0].testId).toMatch(/collection error/i);
50
- expect(parsed.summary.errored).toBe(1);
51
- });
52
- });
53
- describe("partial collection error (one file imports, another is broken)", () => {
54
- const parsed = parsePytestJson(loadFixture("mixed-collection"));
55
- it("keeps env healthy because a real test ran", () => {
56
- expect(parsed.environmentHealthy).toBe(true);
57
- });
58
- it("reports the passing test AND the broken file as an errored result", () => {
59
- expect(parsed.results).toHaveLength(2);
60
- expect(parsed.results.find((r) => r.file === "tests/test_ok.py").status).toBe("pass");
61
- const broken = parsed.results.find((r) => r.file === "tests/test_broken.py");
62
- expect(broken.status).toBe("error");
63
- expect(broken.message).toMatch(/ImportError/);
64
- });
65
- it("counts the collection error in errored/ran", () => {
66
- expect(parsed.summary).toMatchObject({ failed: 0, errored: 1, skipped: 0 });
67
- expect(parsed.summary.ran).toBe(2);
68
- });
69
- });
70
- it("honors an explicit truncated flag", () => {
71
- expect(parsePytestJson(loadFixture("healthy"), { truncated: true }).summary.truncated).toBe(true);
72
- });
73
- });
74
- describe("buildPytestArgs", () => {
75
- it("appends the json-report reporter pointing at the report path", () => {
76
- const args = buildPytestArgs({
77
- selectors: ["tests/test_math.py::test_adds"],
78
- mode: "confirm",
79
- reportPath: "/tmp/r.json",
80
- });
81
- expect(args).toContain("tests/test_math.py::test_adds");
82
- expect(args).toContain("--json-report");
83
- expect(args).toContain("--json-report-file=/tmp/r.json");
84
- expect(args).not.toContain("--maxfail=1");
85
- });
86
- it("caps at the first failure in probe mode", () => {
87
- const args = buildPytestArgs({ selectors: [], mode: "probe", reportPath: "/tmp/r.json" });
88
- expect(args).toContain("--maxfail=1");
89
- });
90
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,62 +0,0 @@
1
- import { getCodeReusePrompt } from "./code-reuse.js";
2
- const POM = "POM-AWARE CODE REUSE"; // unique to the POM branch
3
- const pom = (file, score = 2, rareHits = 2, matchedTokens = ["a-b-c"]) => ({ file, score, rareHits, matchedTokens });
4
- describe("getCodeReusePrompt routing", () => {
5
- it("routes javascript + playwright to the POM-aware prompt", () => {
6
- expect(getCodeReusePrompt("t.spec.js", "javascript", "playwright")).toContain(POM);
7
- });
8
- it("still routes typescript + playwright to the POM-aware prompt", () => {
9
- expect(getCodeReusePrompt("t.spec.ts", "typescript", "playwright")).toContain(POM);
10
- });
11
- it("routes javascript + non-playwright to SkyrampUtils", () => {
12
- expect(getCodeReusePrompt("t.spec.js", "javascript", "jest")).not.toContain(POM);
13
- });
14
- it("routes python to SkyrampUtils (no regression)", () => {
15
- expect(getCodeReusePrompt("t.py", "python", "pytest")).not.toContain(POM);
16
- });
17
- it("does not trigger POM path when framework is undefined", () => {
18
- expect(getCodeReusePrompt("t.spec.ts", "typescript")).not.toContain(POM);
19
- });
20
- });
21
- describe("getCodeReusePrompt scoped POM list", () => {
22
- it("emits the pre-detected two-tier STEP 1 when scoped files are supplied", () => {
23
- const p = getCodeReusePrompt("t.spec.js", "javascript", "playwright", { tier1: [pom("/repo/pages/loginPage.js")], tier2: [pom("/repo/pages/homePage.js", 0.3, 1, ["menu-link-/alerts-item"])] });
24
- expect(p).toContain("ALREADY DETECTED");
25
- expect(p).toContain("/repo/pages/loginPage.js");
26
- expect(p).toContain("catalog fully");
27
- expect(p).toContain("/repo/pages/homePage.js");
28
- expect(p).toContain("signature level");
29
- expect(p).toContain("menu-link-/alerts-item"); // matched tokens surface for tier-2 mapping evidence
30
- expect(p).not.toContain("DETECT POM CLASSES");
31
- });
32
- it("emits the glob STEP 1 when no scoped files are supplied", () => {
33
- expect(getCodeReusePrompt("t.spec.js", "javascript", "playwright")).toContain("DETECT POM CLASSES");
34
- });
35
- it("emits the glob STEP 1 when both tiers are empty (fallback)", () => {
36
- expect(getCodeReusePrompt("t.spec.js", "javascript", "playwright", { tier1: [], tier2: [] }))
37
- .toContain("DETECT POM CLASSES");
38
- });
39
- it("returns the short skip response on a clean scan with zero overlap", () => {
40
- const p = getCodeReusePrompt("t.spec.js", "javascript", "playwright", {
41
- tier1: [], tier2: [], scannedNoOverlap: true,
42
- });
43
- expect(p).toContain("No reusable POM layer detected");
44
- expect(p).toContain("verify: true"); // escape hatch mandates re-verify
45
- expect(p).not.toContain("COMPLIANCE RULES"); // NOT the full workflow prompt
46
- expect(p.length).toBeLessThan(2000);
47
- });
48
- it("keeps the full agent-driven fallback when scoping was inconclusive", () => {
49
- // no scopedPoms argument = scan didn't run or didn't conclude
50
- const p = getCodeReusePrompt("t.spec.js", "javascript", "playwright");
51
- expect(p).toContain("COMPLIANCE RULES");
52
- expect(p).not.toContain("No reusable POM layer detected");
53
- });
54
- it("leaves the SkyrampUtils path untouched for non-Playwright languages", () => {
55
- const p = getCodeReusePrompt("t.py", "python", undefined, { tier1: [], tier2: [], scannedNoOverlap: true });
56
- expect(p).not.toContain("No reusable POM layer detected");
57
- expect(p).toContain("SkyrampUtils");
58
- });
59
- it("does not annotate when scoping simply was not attempted", () => {
60
- expect(getCodeReusePrompt("t.spec.js", "javascript", "playwright")).not.toContain("No reusable POM layer detected");
61
- });
62
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,11 +0,0 @@
1
- import { getPomAwareCodeReusePrompt } from "./pom-aware-code-reuse.js";
2
- describe("getPomAwareCodeReusePrompt language derivation", () => {
3
- it("uses .ts utils filename for typescript (default)", () => {
4
- expect(getPomAwareCodeReusePrompt("t.spec.ts")).toContain("skyrampUtils.ts");
5
- });
6
- it("uses .js utils filename for javascript", () => {
7
- const p = getPomAwareCodeReusePrompt("t.spec.js", "javascript");
8
- expect(p).toContain("skyrampUtils.js");
9
- expect(p).not.toContain("skyrampUtils.ts");
10
- });
11
- });
@@ -1,51 +0,0 @@
1
- import { buildConfirmedFailuresSection } from "./drift-analysis-prompt.js";
2
- function record(overrides = {}) {
3
- return {
4
- mode: "confirm",
5
- ranAt: "2026-07-16T00:00:00.000Z",
6
- environmentHealthy: true,
7
- results: [
8
- { testId: "a.spec.ts › x", file: "a.spec.ts", status: "fail", message: "boom", durationMs: 5 },
9
- ],
10
- summary: { ran: 1, failed: 1, errored: 0, skipped: 0, truncated: false },
11
- ...overrides,
12
- };
13
- }
14
- describe("buildConfirmedFailuresSection", () => {
15
- it("returns empty when there are no records", () => {
16
- expect(buildConfirmedFailuresSection()).toBe("");
17
- expect(buildConfirmedFailuresSection([])).toBe("");
18
- });
19
- it("lists confirmed failures and the intent-rules gate for a healthy confirm run", () => {
20
- const s = buildConfirmedFailuresSection([record()]);
21
- expect(s).toContain("a.spec.ts");
22
- expect(s).toContain("<confirmed_failures>");
23
- expect(s).toContain("<confirmed_failure_intent_rules>");
24
- });
25
- it("excludes unhealthy runs — a wall of red is not PR signal", () => {
26
- expect(buildConfirmedFailuresSection([record({ environmentHealthy: false })])).toBe("");
27
- });
28
- it("excludes skipped runs", () => {
29
- expect(buildConfirmedFailuresSection([record({ skipped: true })])).toBe("");
30
- });
31
- it("excludes verify-mode runs — only confirm establishes which tests broke", () => {
32
- expect(buildConfirmedFailuresSection([record({ mode: "verify" })])).toBe("");
33
- });
34
- it("returns empty when the confirm run had no failures", () => {
35
- const passing = record({
36
- results: [{ testId: "p", file: "p.spec.ts", status: "pass", durationMs: 1 }],
37
- summary: { ran: 1, failed: 0, errored: 0, skipped: 0, truncated: false },
38
- });
39
- expect(buildConfirmedFailuresSection([passing])).toBe("");
40
- });
41
- it("keeps error status distinct and includes it", () => {
42
- const s = buildConfirmedFailuresSection([
43
- record({
44
- results: [{ testId: "e", file: "e.spec.ts", status: "error", message: "fixture broke", durationMs: 1 }],
45
- summary: { ran: 1, failed: 0, errored: 1, skipped: 0, truncated: false },
46
- }),
47
- ]);
48
- expect(s).toContain("e.spec.ts");
49
- expect(s).toContain("[error]");
50
- });
51
- });