@skyramp/mcp 0.3.2 → 0.3.3

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 (137) hide show
  1. package/build/index.js +47 -2
  2. package/build/playwright/PlaywrightTraceService.d.ts +8 -0
  3. package/build/playwright/PlaywrightTraceService.js +1 -0
  4. package/build/prompts/pom-aware-code-reuse.js +17 -8
  5. package/build/prompts/testbot/testbot-prompts.d.ts +2 -12
  6. package/build/prompts/testbot/testbot-prompts.js +24 -5
  7. package/build/resources/testbotResource.js +21 -4
  8. package/build/services/TestExecutionService.d.ts +13 -8
  9. package/build/services/TestExecutionService.js +48 -25
  10. package/build/services/containerEnv.js +24 -0
  11. package/build/tools/queryProxyMocksTool.js +0 -1
  12. package/build/tools/submitReportTool.js +10 -1
  13. package/build/tools/test-management/actionsTool.js +12 -2
  14. package/build/types/TestAnalysis.d.ts +7 -3
  15. package/build/types/TestbotPromptOptions.d.ts +35 -0
  16. package/build/types/TestbotPromptOptions.js +1 -0
  17. package/build/types/index.d.ts +1 -0
  18. package/build/utils/frontendSelectors.js +0 -1
  19. package/build/utils/gitStaging.d.ts +5 -0
  20. package/build/utils/gitStaging.js +1 -1
  21. package/build/utils/pom-catalog.d.ts +23 -0
  22. package/build/utils/pom-catalog.js +30 -0
  23. package/build/utils/pom-scope/pom-files.d.ts +14 -0
  24. package/build/utils/pom-scope/pom-files.js +32 -6
  25. package/build/utils/pom-scope/testIdDiscovery.d.ts +40 -0
  26. package/build/utils/pom-scope/testIdDiscovery.js +104 -0
  27. package/build/utils/reportVerification.d.ts +7 -2
  28. package/build/utils/reportVerification.js +9 -3
  29. package/build/utils/versions.d.ts +3 -3
  30. package/build/utils/versions.js +1 -1
  31. package/node_modules/playwright/ThirdPartyNotices.txt +319 -266
  32. package/node_modules/playwright/lib/dom-analyzer/blueprint.js +154 -27
  33. package/node_modules/playwright/lib/dom-analyzer/crawler.js +2 -2
  34. package/node_modules/playwright/lib/mcp/browser/tools/pageBlueprint.js +1 -1
  35. package/node_modules/playwright/lib/mcp/browser/tools/sitemap.js +6 -2
  36. package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +3 -2
  37. package/node_modules/playwright/lib/mcp/skyramp/resultCode.js +4 -3
  38. package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +15 -3
  39. package/node_modules/playwright/lib/mcp/skyramp/specImport.js +781 -0
  40. package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +14 -3
  41. package/node_modules/playwright/lib/mcp/test/resultCode.test.js +2 -1
  42. package/node_modules/playwright/lib/mcp/test/skyRampExport.js +1 -1
  43. package/node_modules/playwright/lib/mcp/test/skyRampExport.test.js +30 -0
  44. package/node_modules/playwright/lib/transform/babelBundleImpl.js +200 -199
  45. package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +3 -3
  46. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +3 -3
  47. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/adapter/aws-lambda/handler.js +16 -25
  48. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/adapter/bun/websocket.js +3 -1
  49. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/adapter/lambda-edge/handler.js +20 -4
  50. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/adapter/aws-lambda/handler.js +16 -25
  51. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/adapter/bun/websocket.js +3 -1
  52. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/adapter/lambda-edge/handler.js +20 -4
  53. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +10 -1
  54. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +1 -1
  55. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/css/common.js +3 -1
  56. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/css/index.js +9 -1
  57. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +8 -14
  58. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +41 -21
  59. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +131 -5
  60. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +9 -7
  61. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +1 -1
  62. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +1 -1
  63. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +2 -1
  64. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +2 -5
  65. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +2 -1
  66. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -32
  67. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-override/index.js +5 -3
  68. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/serve-static/index.js +2 -2
  69. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/timing/timing.js +3 -1
  70. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +9 -0
  71. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +12 -4
  72. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/buffer.js +2 -1
  73. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +6 -1
  74. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/validator/validator.js +3 -3
  75. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +10 -1
  76. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +1 -1
  77. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/css/common.js +3 -1
  78. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/css/index.js +9 -1
  79. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +15 -15
  80. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +42 -22
  81. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +129 -5
  82. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +10 -8
  83. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/bearer-auth/index.js +1 -1
  84. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +1 -1
  85. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +2 -1
  86. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +2 -5
  87. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +2 -1
  88. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -32
  89. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-override/index.js +5 -3
  90. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/serve-static/index.js +2 -2
  91. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/timing/timing.js +3 -1
  92. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +9 -0
  93. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/handler.d.ts +1 -1
  94. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/lambda-edge/handler.d.ts +1 -1
  95. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/helper/websocket/index.d.ts +1 -1
  96. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +1 -3
  97. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/context.d.ts +39 -0
  98. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/context-storage/index.d.ts +2 -2
  99. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/language/language.d.ts +18 -0
  100. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/body.d.ts +1 -1
  101. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/types.d.ts +1 -1
  102. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +12 -4
  103. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/buffer.js +2 -1
  104. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +6 -1
  105. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/validator/validator.js +3 -3
  106. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +29 -22
  107. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +3 -3
  108. package/node_modules/playwright/node_modules/playwright-core/lib/generated/pollingRecorderSource.js +1 -1
  109. package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +5 -1
  110. package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/specReader.js +781 -0
  111. package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderApp.js +25 -6
  112. package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/skyramp/replayEngine.js +3 -1
  113. package/node_modules/playwright/node_modules/playwright-core/lib/utils.js +2 -0
  114. package/node_modules/playwright/node_modules/playwright-core/lib/vite/htmlReport/index.html +253 -27
  115. package/node_modules/playwright/node_modules/playwright-core/lib/vite/recorder/assets/{codeMirrorModule-D0BjbCb7.js → codeMirrorModule-DtudTj_v.js} +1 -1
  116. package/node_modules/playwright/node_modules/playwright-core/lib/vite/recorder/assets/index-BpDwp16L.js +422 -0
  117. package/node_modules/playwright/node_modules/playwright-core/lib/vite/recorder/index.html +1 -1
  118. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/assets/{codeMirrorModule-Bzd72-bG.js → codeMirrorModule-FNMuBzX1.js} +1 -1
  119. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-Co9upU5h.js +1035 -0
  120. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.DXNIQ_dx.js +2 -0
  121. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +2 -2
  122. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CIKB3XSv.js +5 -0
  123. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +2 -2
  124. package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
  125. package/node_modules/playwright/node_modules/playwright-core/src/generated/pollingRecorderSource.ts +1 -1
  126. package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +4 -0
  127. package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/specReader.ts +1028 -0
  128. package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderApp.ts +31 -8
  129. package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/skyramp/replayEngine.ts +1 -0
  130. package/node_modules/playwright/node_modules/playwright-core/src/utils.ts +1 -0
  131. package/node_modules/playwright/package.json +1 -1
  132. package/package.json +9 -6
  133. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/tsconfig.build.tsbuildinfo +0 -1
  134. package/node_modules/playwright/node_modules/playwright-core/lib/vite/recorder/assets/index-lvTRGFx-.js +0 -193
  135. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-DzxTioTK.js +0 -809
  136. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.BGc30U3S.js +0 -2
  137. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/uiMode.IaDrb29A.js +0 -5
@@ -114,7 +114,9 @@ class TraceRecordingBackend {
114
114
  `--load-extension=${loadExtension.join(",")}`
115
115
  ] : void 0;
116
116
  const headless = loadExtension?.length ? false : this._options.headless ?? (!!process.env.CI || import_os.default.platform() === "linux" && !process.env.DISPLAY);
117
+ const testIdAttribute = process.env.PLAYWRIGHT_MCP_TEST_ID_ATTRIBUTE?.trim() || this._options.testIdAttribute?.trim();
117
118
  const config = await (0, import_config.resolveConfig)({
119
+ ...testIdAttribute ? { testIdAttribute } : {},
118
120
  browser: {
119
121
  isolated: !persistent,
120
122
  ...persistent && userDataDir ? { userDataDir } : {},
@@ -562,8 +564,11 @@ Baseline "${input.filename}" (${params.snapshotType})${targetDesc} recorded; the
562
564
  return { content: [{ type: "text", text: `### Error
563
565
  Pass at most ONE of stopAtStep / stopAtUrl / stopBefore (got ${stopParams.join(", ")}). Omit all three to replay the whole trace.` }], isError: true };
564
566
  let loadedActions;
567
+ let sourceDiagnostics;
565
568
  try {
566
- loadedActions = await (0, import_skyRampImport.actionsFromPath)(params.path);
569
+ const source = await (0, import_skyRampImport.traceSourceFromPath)(params.path);
570
+ loadedActions = source.actions;
571
+ sourceDiagnostics = source.diagnostics;
567
572
  } catch (e) {
568
573
  return { content: [{ type: "text", text: `### Error
569
574
  Failed to load trace from ${params.path}: ${e.message}` }], isError: true };
@@ -571,6 +576,10 @@ Failed to load trace from ${params.path}: ${e.message}` }], isError: true };
571
576
  if (!loadedActions.length)
572
577
  return { content: [{ type: "text", text: `### Error
573
578
  No actions found in ${params.path}.` }], isError: true };
579
+ const diagnosticsNote = sourceDiagnostics.length ? `
580
+
581
+ Note: loaded from a generated test file \u2014 the replayable interaction skeleton was extracted. ${sourceDiagnostics.length} statement(s) were not converted to steps:
582
+ ` + sourceDiagnostics.map((d) => `- line ${d.line}: ${d.text} (${d.reason})`).join("\n") : "";
574
583
  if (params.startAtStep !== void 0 && params.stopAtStep !== void 0 && params.startAtStep > params.stopAtStep)
575
584
  return { content: [{ type: "text", text: `### Error
576
585
  startAtStep (${params.startAtStep}) is after stopAtStep (${params.stopAtStep}).` }], isError: true };
@@ -583,7 +592,7 @@ startAtStep (${params.startAtStep}) is after stopAtStep (${params.stopAtStep}).`
583
592
  ${loadedActions.length} steps in ${params.path}. Nothing was replayed.
584
593
 
585
594
  Steps:
586
- ${stepList}
595
+ ${stepList}${diagnosticsNote}
587
596
 
588
597
  Call skyramp_load_trace again to replay: set startAtStep to skip a stale prefix (e.g. an old login) and/or one of stopAtStep / stopAtUrl / stopBefore to stop early. Omit all to replay the whole trace.`
589
598
  }]
@@ -680,7 +689,7 @@ You can continue recording from this point or fix the issue.` : "";
680
689
  content: [{
681
690
  type: "text",
682
691
  text: `### Trace replayed
683
- ${replayedCount} of ${loadedActions.length} steps replayed from ${params.path}.${skippedNote} ${stoppedNote}${errorNote}
692
+ ${replayedCount} of ${loadedActions.length} steps replayed from ${params.path}.${skippedNote} ${stoppedNote}${errorNote}${diagnosticsNote}
684
693
 
685
694
  Remaining steps (NOT replayed):
686
695
  ${remaining}
@@ -1650,6 +1659,8 @@ Cell row ${params.row}, column ${params.column} has "${actual}", expected "${par
1650
1659
  if (recId && mcpId && recId !== mcpId)
1651
1660
  continue;
1652
1661
  ri++;
1662
+ if (rec.action?.name === "fill" && rec.action.isPassword)
1663
+ ta.isPassword = true;
1653
1664
  const rebuilt = this._rebuildCodeFromRecorder(rec, ta.code);
1654
1665
  if (rebuilt) {
1655
1666
  traceDebug(`[consume] ${ta.toolName} -> ${rebuilt}`);
@@ -24,9 +24,10 @@ function bigSnapshot(chars) {
24
24
  (0, import_vitest.expect)(out).toContain(snapshot);
25
25
  (0, import_vitest.expect)(out).toContain("```yaml");
26
26
  });
27
- (0, import_vitest.it)("also handles a ```javascript fence", () => {
27
+ (0, import_vitest.it)("falls back to line replacement for a non-```js fence (only ```js is spliced)", () => {
28
28
  const out = (0, import_resultCode.rewriteResultCodeText)(clickResult(bigSnapshot(500), "javascript"), NEW_CODE);
29
29
  (0, import_vitest.expect)(out).toContain(NEW_CODE);
30
+ (0, import_vitest.expect)(out).not.toContain('await page.getByRole("button", { name: "TextBlock" }).click();');
30
31
  });
31
32
  (0, import_vitest.it)("falls back to line replacement when there is no fenced code block", () => {
32
33
  const text = '### Result\nawait page.getByRole("button").click();\n\n### Page state\n' + bigSnapshot(500);
@@ -325,7 +325,7 @@ function trackedActionToJsonl(action, pageGuid, timestamp) {
325
325
  if (toolName === "browser_type" || toolName === "browser_press_sequentially") {
326
326
  const text = args.text ?? extractFillText(code);
327
327
  const name = toolName === "browser_press_sequentially" || args.slowly ? "pressSequentially" : "fill";
328
- return JSON.stringify({ name, selector, text, locator: locatorObj, ...base });
328
+ return JSON.stringify({ name, selector, text, isPassword: action.isPassword || void 0, locator: locatorObj, ...base });
329
329
  }
330
330
  if (toolName === "browser_fill_form") {
331
331
  return null;
@@ -42,3 +42,33 @@ function jsonlFor(action) {
42
42
  (0, import_vitest.expect)(entry.state).toBe("hidden");
43
43
  });
44
44
  });
45
+ (0, import_vitest.describe)("browser_type \u2192 isPassword flag", () => {
46
+ function typeAction(extra = {}) {
47
+ return {
48
+ toolName: "browser_type",
49
+ args: { text: "s3cret" },
50
+ code: `await page.locator('#login-password').fill('s3cret');`,
51
+ timestamp: 1e3,
52
+ ...extra
53
+ };
54
+ }
55
+ (0, import_vitest.it)("marks a fill correlated to a password input", () => {
56
+ const entry = jsonlFor(typeAction({ isPassword: true }));
57
+ (0, import_vitest.expect)(entry.name).toBe("fill");
58
+ (0, import_vitest.expect)(entry.isPassword).toBe(true);
59
+ });
60
+ (0, import_vitest.it)("omits the key entirely when not a password", () => {
61
+ const line = (0, import_skyRampExport.trackedActionToJsonl)(typeAction(), "guid-1", 1e3);
62
+ (0, import_vitest.expect)(JSON.parse(line).isPassword).toBeUndefined();
63
+ (0, import_vitest.expect)(line).not.toContain("isPassword");
64
+ });
65
+ (0, import_vitest.it)("omits the key when correlation reported false", () => {
66
+ const line = (0, import_skyRampExport.trackedActionToJsonl)(typeAction({ isPassword: false }), "guid-1", 1e3);
67
+ (0, import_vitest.expect)(line).not.toContain("isPassword");
68
+ });
69
+ (0, import_vitest.it)("carries the flag through pressSequentially too", () => {
70
+ const entry = jsonlFor(typeAction({ args: { text: "s3cret", slowly: true }, isPassword: true }));
71
+ (0, import_vitest.expect)(entry.name).toBe("pressSequentially");
72
+ (0, import_vitest.expect)(entry.isPassword).toBe(true);
73
+ });
74
+ });