rustwright 0.1.0a2__tar.gz → 0.1.0a4__tar.gz

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 (154) hide show
  1. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.dockerignore +0 -1
  2. rustwright-0.1.0a4/.github/sync.yml +53 -0
  3. rustwright-0.1.0a4/.github/workflows/auto-merge-sync.yml +48 -0
  4. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/workflows/release-npm.yml +1 -1
  5. rustwright-0.1.0a4/.github/workflows/sync-rustwright-cloud.yml +62 -0
  6. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/BENCHMARK.md +1 -1
  7. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/CODE_ARCHITECTURE.md +2 -2
  8. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/Cargo.lock +2 -2
  9. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/Cargo.toml +6 -2
  10. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/Dockerfile +0 -7
  11. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/PKG-INFO +1 -1
  12. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/run_benchmarks.py +3 -405
  13. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/async-design.md +63 -7
  14. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/pyproject.toml +1 -4
  15. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/sync_api.py +335 -287
  16. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/src/lib.rs +1506 -225
  17. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_rustwright_sync_api.py +328 -88
  18. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/docker_test.sh +0 -3
  19. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/render_project_tables.py +0 -21
  20. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_antibot_benchmarks.py +1 -339
  21. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_benchmark_matrix.py +1 -9
  22. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_mind2web_benchmark.py +1 -286
  23. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_mind2web_matrix.py +1 -1
  24. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_mind2web_sharded.py +1 -1
  25. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_remote_docker_test.py +0 -1
  26. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  28. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  29. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  30. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/dependabot.yml +0 -0
  31. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/prompts/code-review.md +0 -0
  32. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/workflows/benchmark-testbox.yml +0 -0
  33. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/workflows/benchmark.yml +0 -0
  34. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/workflows/claude-code-review.yml +0 -0
  35. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/workflows/release-pypi.yml +0 -0
  36. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.github/workflows/test.yml +0 -0
  37. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/.gitignore +0 -0
  38. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/CODE_OF_CONDUCT.md +0 -0
  39. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/CONTRIBUTING.md +0 -0
  40. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/LICENSE +0 -0
  41. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/LIMITATIONS.md +0 -0
  42. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/README.md +0 -0
  43. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/SECURITY.md +0 -0
  44. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/README.md +0 -0
  45. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/async_concurrency_load.py +0 -0
  46. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/automation_cases.py +0 -0
  47. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/basemark/README.md +0 -0
  48. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/basemark/benchmark.json +0 -0
  49. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/basemark/run.py +0 -0
  50. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/browser_speed/README.md +0 -0
  51. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/browser_speed/list.py +0 -0
  52. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/browser_speed_lib.py +0 -0
  53. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/browsertime/README.md +0 -0
  54. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/browsertime/benchmark.json +0 -0
  55. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/browsertime/run.py +0 -0
  56. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/browsertime/scripts/basic_journey.cjs +0 -0
  57. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/browsertime/urls/default.txt +0 -0
  58. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/crossbench/README.md +0 -0
  59. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/crossbench/benchmark.json +0 -0
  60. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/crossbench/run.py +0 -0
  61. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/jetstream/README.md +0 -0
  62. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/jetstream/benchmark.json +0 -0
  63. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/jetstream/run.py +0 -0
  64. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/motionmark/README.md +0 -0
  65. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/motionmark/benchmark.json +0 -0
  66. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/motionmark/run.py +0 -0
  67. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/speedometer/README.md +0 -0
  68. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/speedometer/benchmark.json +0 -0
  69. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/speedometer/run.py +0 -0
  70. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/tachometer/README.md +0 -0
  71. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/tachometer/benchmark.json +0 -0
  72. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/tachometer/cases/dom_append.html +0 -0
  73. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/tachometer/cases/layout_read.html +0 -0
  74. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/tachometer/cases/selector_query.html +0 -0
  75. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/tachometer/run.py +0 -0
  76. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/telescope/README.md +0 -0
  77. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/telescope/benchmark.json +0 -0
  78. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/telescope/run.py +0 -0
  79. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/webpagetest/README.md +0 -0
  80. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/webpagetest/benchmark.json +0 -0
  81. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/webpagetest/run.py +0 -0
  82. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/benchmarks/webpagetest/scripts/basic_navigation.wpt +0 -0
  83. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/RELEASING.md +0 -0
  84. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/api-surface/playwright-async-api-classifications.json +0 -0
  85. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/api-surface/playwright-async-api.json +0 -0
  86. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/api-surface/playwright-async-api.md +0 -0
  87. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/api-surface/playwright-sync-api-classifications.json +0 -0
  88. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/api-surface/playwright-sync-api.json +0 -0
  89. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/api-surface/playwright-sync-api.md +0 -0
  90. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/assets/banner.png +0 -0
  91. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/assets/logo.png +0 -0
  92. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/docs/assets/mascot.png +0 -0
  93. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/examples/quickstart.py +0 -0
  94. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/__init__.py +0 -0
  95. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/__main__.py +0 -0
  96. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_backend.py +0 -0
  97. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/__init__.py +0 -0
  98. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/cloakbrowser/__init__.py +0 -0
  99. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/patchright/__init__.py +0 -0
  100. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/patchright/__main__.py +0 -0
  101. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/patchright/_impl/__init__.py +0 -0
  102. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/patchright/_impl/_errors.py +0 -0
  103. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/patchright/async_api.py +0 -0
  104. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/patchright/pytest_plugin.py +0 -0
  105. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/patchright/sync_api.py +0 -0
  106. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/playwright/__init__.py +0 -0
  107. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/playwright/__main__.py +0 -0
  108. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/playwright/_impl/__init__.py +0 -0
  109. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/playwright/_impl/_errors.py +0 -0
  110. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/playwright/async_api.py +0 -0
  111. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/playwright/pytest_plugin.py +0 -0
  112. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/playwright/sync_api.py +0 -0
  113. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/pytest_playwright/__init__.py +0 -0
  114. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/pytest_playwright/py.typed +0 -0
  115. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_compat/pytest_playwright/pytest_playwright.py +0 -0
  116. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/_devices.py +0 -0
  117. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/async_api.py +0 -0
  118. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/cli.py +0 -0
  119. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/python/rustwright/pytest_plugin.py +0 -0
  120. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/fixtures/mind2web_sample.json +0 -0
  121. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_antibot_benchmarks.py +0 -0
  122. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_mind2web_benchmark.py +0 -0
  123. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_playwright_compat_optin.py +0 -0
  124. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_playwright_parity_cases.py +0 -0
  125. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_project_status_tools.py +0 -0
  126. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_skyvern_alias_command.py +0 -0
  127. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_skyvern_cloud_overlay_tests.py +0 -0
  128. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_skyvern_prompt_overlay_smoke.py +0 -0
  129. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tests/test_skyvern_replacement_smoke.py +0 -0
  130. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/api_surface_audit.py +0 -0
  131. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/audit_skyvern_playwright_usage.py +0 -0
  132. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/check_benchmark_artifacts.py +0 -0
  133. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/check_cross_library_speed_goal.py +0 -0
  134. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/check_external_reliability_goal.py +0 -0
  135. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/check_launch_latency_claim.py +0 -0
  136. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/check_native_extension.py +0 -0
  137. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/check_phase1_gate.py +0 -0
  138. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/check_phase2_benchmark.py +0 -0
  139. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/check_testbox_visibility.py +0 -0
  140. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/docker_verify.sh +0 -0
  141. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/download_mind2web.py +0 -0
  142. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/import_mind2web.py +0 -0
  143. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/import_webvoyager.py +0 -0
  144. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/query_project_state.py +0 -0
  145. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/render_benchmark_matrix.py +0 -0
  146. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_benchmark_testbox.sh +0 -0
  147. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_parity_cases.py +0 -0
  148. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_skyvern_alias_command.py +0 -0
  149. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_skyvern_cloud_overlay_tests.py +0 -0
  150. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_skyvern_prompt_overlay_smoke.py +0 -0
  151. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_skyvern_replacement_smoke.py +0 -0
  152. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_webvoyager_benchmark.py +0 -0
  153. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/run_webvoyager_matrix.py +0 -0
  154. {rustwright-0.1.0a2 → rustwright-0.1.0a4}/tools/rustwright_ts_binding.js +0 -0
@@ -1,7 +1,6 @@
1
1
  .git
2
2
  .audit-playwright
3
3
  .venv
4
- .venv_browser_harness_compare
5
4
  .pytest_cache
6
5
  .mypy_cache
7
6
  .ruff_cache
@@ -0,0 +1,53 @@
1
+ # Shared Rustwright files mirrored from rustwright to rustwright-cloud.
2
+ # Repository-specific GitHub workflows and metadata are intentionally excluded.
3
+ # Cloud-only additions must live outside the mirrored paths below.
4
+ Skyvern-AI/rustwright-cloud:
5
+ - source: benchmarks/
6
+ dest: benchmarks/
7
+ deleteOrphaned: true
8
+ - source: docs/
9
+ dest: docs/
10
+ deleteOrphaned: true
11
+ - source: node/
12
+ dest: node/
13
+ deleteOrphaned: true
14
+ - source: python/
15
+ dest: python/
16
+ deleteOrphaned: true
17
+ - source: src/
18
+ dest: src/
19
+ deleteOrphaned: true
20
+ - source: tests/
21
+ dest: tests/
22
+ deleteOrphaned: true
23
+ - source: tools/
24
+ dest: tools/
25
+ deleteOrphaned: true
26
+ - source: .dockerignore
27
+ dest: .dockerignore
28
+ - source: .gitignore
29
+ dest: .gitignore
30
+ - source: BENCHMARK.md
31
+ dest: BENCHMARK.md
32
+ - source: CODE_ARCHITECTURE.md
33
+ dest: CODE_ARCHITECTURE.md
34
+ - source: CODE_OF_CONDUCT.md
35
+ dest: CODE_OF_CONDUCT.md
36
+ - source: CONTRIBUTING.md
37
+ dest: CONTRIBUTING.md
38
+ - source: Cargo.lock
39
+ dest: Cargo.lock
40
+ - source: Cargo.toml
41
+ dest: Cargo.toml
42
+ - source: Dockerfile
43
+ dest: Dockerfile
44
+ - source: LICENSE
45
+ dest: LICENSE
46
+ - source: LIMITATIONS.md
47
+ dest: LIMITATIONS.md
48
+ - source: README.md
49
+ dest: README.md
50
+ - source: SECURITY.md
51
+ dest: SECURITY.md
52
+ - source: pyproject.toml
53
+ dest: pyproject.toml
@@ -0,0 +1,48 @@
1
+ name: Auto-merge sync PRs
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, reopened, ready_for_review, labeled, synchronize]
6
+
7
+ permissions:
8
+ contents: write
9
+ pull-requests: write
10
+ checks: read
11
+
12
+ jobs:
13
+ merge-when-sync:
14
+ # Auto-merge only machine-generated mirror PRs:
15
+ # - carry the 'sync' label applied by repo-file-sync-action
16
+ # - branch created by the sync action (repo-sync/*)
17
+ # - opened by the configured sync actor
18
+ if: >-
19
+ contains(join(github.event.pull_request.labels.*.name, ','), 'sync') &&
20
+ startsWith(github.event.pull_request.head.ref, 'repo-sync/') &&
21
+ github.event.pull_request.user.login == vars.RUSTWRIGHT_SYNC_ACTOR
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - name: Wait for required checks to pass
25
+ uses: lewagon/wait-on-check-action@74049309dfeff245fe8009a0137eacf28136cb3c # v1.5.0
26
+ with:
27
+ ref: ${{ github.event.pull_request.head.sha }}
28
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
29
+ wait-interval: 15
30
+ allowed-conclusions: success,skipped,neutral
31
+ ignore-checks: merge-when-sync,claude-review
32
+ - name: Verify PR is still open
33
+ env:
34
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35
+ run: |
36
+ STATE=$(gh pr view ${{ github.event.pull_request.number }} --repo "${{ github.repository }}" --json state --jq '.state')
37
+ if [ "$STATE" != "OPEN" ]; then
38
+ echo "::error::PR is $STATE — aborting merge"
39
+ exit 1
40
+ fi
41
+ - name: Merge sync PR with admin bypass
42
+ env:
43
+ GH_TOKEN: ${{ secrets.RUSTWRIGHT_SYNC_GH_PAT }}
44
+ run: |-
45
+ gh pr merge ${{ github.event.pull_request.number }} \
46
+ --squash \
47
+ --admin \
48
+ --repo "${{ github.repository }}"
@@ -276,6 +276,6 @@ jobs:
276
276
  esac
277
277
 
278
278
  - name: Publish experimental package with provenance
279
- run: npm publish npm-dist/*.tgz --provenance --access public --tag next
279
+ run: npm publish ./npm-dist/*.tgz --provenance --access public --tag next
280
280
  env:
281
281
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,62 @@
1
+ name: Sync rustwright changes to rustwright-cloud
2
+
3
+ on:
4
+ pull_request_target:
5
+ types: [closed]
6
+ branches: [main]
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+ issues: write
12
+ pull-requests: write
13
+
14
+ jobs:
15
+ sync:
16
+ if: >-
17
+ github.event_name == 'workflow_dispatch' ||
18
+ (github.event.pull_request.merged == true &&
19
+ !contains(join(github.event.pull_request.labels.*.name, ','), 'sync') &&
20
+ !startsWith(github.event.pull_request.head.ref, 'repo-sync/'))
21
+ runs-on: blacksmith-2vcpu-ubuntu-2404
22
+ steps:
23
+ - name: Checkout main
24
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
25
+ with:
26
+ ref: main
27
+ fetch-depth: 0
28
+ persist-credentials: false
29
+
30
+ - name: Sync shared files to rustwright-cloud
31
+ id: file-sync
32
+ uses: Skyvern-AI/repo-file-sync-action@590c4ddbe1d7b5c4ca1e4b4edc85c7f919b6c26a # main
33
+ with:
34
+ GH_PAT: ${{ secrets.RUSTWRIGHT_SYNC_GH_PAT }}
35
+ GIT_EMAIL: ${{ github.event.pull_request.user.id && format('{0}+{1}@users.noreply.github.com', github.event.pull_request.user.id, github.event.pull_request.user.login) || format('{0}@users.noreply.github.com', github.actor) }}
36
+ GIT_USERNAME: ${{ github.event.pull_request.user.login || github.actor }}
37
+ PR_LABELS: sync
38
+ BRANCH_NAME: repo-sync/rustwright-${{ github.event.pull_request.number || github.run_id }}
39
+ PR_BODY: ${{ github.event.pull_request.html_url || 'Manual sync from rustwright' }}
40
+ PR_TITLE: "Sync rustwright changes to rustwright-cloud (#${{ github.event.pull_request.number || github.run_id }})"
41
+
42
+ - name: Link the rustwright-cloud PR
43
+ if: github.event_name == 'pull_request_target' && steps.file-sync.outputs.pull_request_urls
44
+ uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
45
+ env:
46
+ PR_URLS: ${{ steps.file-sync.outputs.pull_request_urls }}
47
+ with:
48
+ script: |
49
+ let urls;
50
+ try {
51
+ urls = JSON.parse(process.env.PR_URLS);
52
+ } catch {
53
+ urls = [process.env.PR_URLS].filter(Boolean);
54
+ }
55
+ if (urls.length) {
56
+ await github.rest.issues.createComment({
57
+ owner: context.repo.owner,
58
+ repo: context.repo.repo,
59
+ issue_number: context.payload.pull_request.number,
60
+ body: urls.map((url) => `Synced to rustwright-cloud: ${url}`).join('\n'),
61
+ });
62
+ }
@@ -50,7 +50,7 @@ changed after the testbox was warmed, rebuild the image inside the testbox after
50
50
  the local changes sync:
51
51
 
52
52
  ```bash
53
- blacksmith testbox run --id <ID> "TEST_DOCKER_MEMORY_LIMIT=8g RUSTWRIGHT_DOCKER_IMAGE=rustwright-verify-testbox INSTALL_BROWSER_HARNESS=1 INSTALL_PUPPETEER=1 tools/docker_test.sh build ."
53
+ blacksmith testbox run --id <ID> "TEST_DOCKER_MEMORY_LIMIT=8g RUSTWRIGHT_DOCKER_IMAGE=rustwright-verify-testbox INSTALL_PUPPETEER=1 tools/docker_test.sh build ."
54
54
  ```
55
55
 
56
56
  For large task suites such as Mind2Web, prefer the sharded Docker runner so each
@@ -25,12 +25,12 @@ Last updated: 2026-05-25
25
25
  | `python/rustwright/pytest_plugin.py` | Pytest fixtures. |
26
26
  | `python/playwright/*`, `python/patchright/*`, `python/cloakbrowser/*` | Compatibility import packages. Public alpha compatibility imports should be enabled only through opt-in compatibility mode. |
27
27
  | `benchmarks/automation_cases.py` | 408 shared Playwright-style automation/parity cases and the 15-case benchmark subset, including WebVoyager/Mind2Web-style workflow cases. |
28
- | `benchmarks/run_benchmarks.py` | Rustwright, Playwright, and browser-harness benchmark runner for the 15-case comparable workload. |
28
+ | `benchmarks/run_benchmarks.py` | Rustwright and Playwright benchmark runner for the 15-case comparable workload. |
29
29
  | `tests/test_rustwright_sync_api.py` | Main behavior/regression suite. |
30
30
  | `tests/test_playwright_parity_cases.py` | Shared parity harness test entry point. |
31
31
  | `tools/api_surface_audit.py` | Public API surface comparison against reference Playwright. |
32
32
  | `tools/run_parity_cases.py` | Runs shared parity cases against Rustwright or reference Playwright. |
33
- | `tools/run_antibot_benchmarks.py` | Anti-bot benchmark runner covering Tier 0 local smoke signals, Tier 1 public fingerprint adapters for SannySoft, CreepJS, BrowserScan, and DeviceAndBrowserInfo, and local Tier 4 fresh/warm profile matrix checks across Rustwright, Playwright, and browser-harness. |
33
+ | `tools/run_antibot_benchmarks.py` | Anti-bot benchmark runner covering Tier 0 local smoke signals, Tier 1 public fingerprint adapters for SannySoft, CreepJS, BrowserScan, and DeviceAndBrowserInfo, and local Tier 4 fresh/warm profile matrix checks across Rustwright and Playwright. |
34
34
 
35
35
  ## Known Architecture Debt
36
36
 
@@ -1024,7 +1024,7 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
1024
1024
 
1025
1025
  [[package]]
1026
1026
  name = "rustwright-core"
1027
- version = "0.1.0-alpha.2"
1027
+ version = "0.1.0-alpha.4"
1028
1028
  dependencies = [
1029
1029
  "base64 0.21.7",
1030
1030
  "bytes",
@@ -1056,7 +1056,7 @@ dependencies = [
1056
1056
 
1057
1057
  [[package]]
1058
1058
  name = "rustwright-node"
1059
- version = "0.1.0-alpha.2"
1059
+ version = "0.1.0-alpha.4"
1060
1060
  dependencies = [
1061
1061
  "napi",
1062
1062
  "napi-build",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rustwright-core"
3
- version = "0.1.0-alpha.2"
3
+ version = "0.1.0-alpha.4"
4
4
  edition = "2021"
5
5
  rust-version = "1.85"
6
6
  description = "Rust CDP core for a Python Playwright-compatible automation API"
@@ -14,6 +14,10 @@ categories = ["web-programming"]
14
14
  [workspace]
15
15
  resolver = "2"
16
16
 
17
+ [features]
18
+ default = ["python"]
19
+ python = ["dep:pyo3"]
20
+
17
21
  [lib]
18
22
  name = "_rustwright"
19
23
  crate-type = ["cdylib", "rlib"]
@@ -25,7 +29,7 @@ futures-channel = "=0.3.31"
25
29
  futures-core = "=0.3.31"
26
30
  futures-sink = "=0.3.31"
27
31
  futures-task = "=0.3.31"
28
- pyo3 = { version = "0.29", features = ["abi3-py38"] }
32
+ pyo3 = { version = "0.29", features = ["abi3-py38"], optional = true }
29
33
  reqwest = { version = "=0.12.28", default-features = false, features = ["json", "rustls-tls"] }
30
34
  serde = { version = "=1.0.188", features = ["derive"] }
31
35
  serde_json = "=1.0.107"
@@ -5,7 +5,6 @@ FROM ${RUSTWRIGHT_DOCKER_BASE_IMAGE}
5
5
  USER root
6
6
 
7
7
  ARG PLAYWRIGHT_REFERENCE_VERSION=1.59.0
8
- ARG INSTALL_BROWSER_HARNESS=1
9
8
  ARG INSTALL_PUPPETEER=0
10
9
 
11
10
  ENV CARGO_HOME=/usr/local/cargo \
@@ -101,12 +100,6 @@ RUN case "$(uname -m)" in \
101
100
  && test -n "$browser" \
102
101
  && ln -sf "$browser" "$RUSTWRIGHT_CHROMIUM"
103
102
 
104
- RUN --mount=type=cache,target=/root/.cache/pip \
105
- if [ "$INSTALL_BROWSER_HARNESS" = "1" ]; then \
106
- python -m pip install "browser-harness @ git+https://github.com/browser-use/browser-harness.git" \
107
- || echo "browser-harness optional install failed; benchmark runner will report it as skipped"; \
108
- fi
109
-
110
103
  RUN --mount=type=cache,target=/root/.npm \
111
104
  if [ "$INSTALL_PUPPETEER" = "1" ]; then \
112
105
  apt-get update \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rustwright
3
- Version: 0.1.0a2
3
+ Version: 0.1.0a4
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Programming Language :: Python :: 3