Repository navigation
Release wdio_flutter to pub.dev (under the official webdriverio verified publisher) #479
Description
Track publishing the wdio_flutter Dart contract to pub.dev, gated on standing up the official webdriverio verified publisher.
Context
wdio_flutter is the app-side cooperative contract for @wdio/flutter-service. It gates browser.flutter.execute (Dart handlers) and browser.flutter.mock (the cooperative mock registry). Native automation doesn't need it: find, tap, deeplink, contexts and logs all work through appium-flutter-driver. So it doesn't block the Flutter service itself, only the execute/mock features for end users.
#466 wired ReleaseKit's pub.dev publishing but left it disabled (publish.pub.enabled: false), so it doesn't gate @wdio/flutter-service prereleases. pub.dev rights are stricter than crates.io: there's no personal-token "create on first publish", so the first publish must be manual on an already-registered package before automated publishing can be configured. We want the official publisher in place rather than publishing under a personal account.
Blocker
- Set up the official webdriverio verified publisher on pub.dev (an org/admin task, and the long pole).
Also needed before the first release
Found when standing PR #642's publish was refused on 2026-10-06:
- ReleaseKit fix for Group strategy tags Dart packages without bumping pubspec.yaml or recording the update goosewobbler/releasekit#649, released and pinned here. In group mode, ReleaseKit tags a Dart package without bumping its pubspec or recording the update, and the publish check then refuses the whole release. Bump the
goosewobbler/[email protected]pins in_release.reusable.yml(two uses),_standing-pr-update.reusable.yml,release.ymlandrelease-preview.yml. Until then, any Flutter release that includeswdio_flutterfails the way chore: release 17 package(s) #642 did. - Remove
publish_to: nonefrompackages/flutter-bridge/pubspec.yaml. chore(release): revert the unpublished #642 release and fix standing-PR selection #707 added it to keep the package out of versioning; while it's there, ReleaseKit skips the package anddart pub publishrefuses it. - Add
packages/flutter-bridge/CHANGELOG.md. chore(release): wire wdio_flutter pub.dev publishing (disabled pending wdio publisher) #466 listed it as pre-staged, but it never existed at either path, and pub.dev expects one. - Dry-run ReleaseKit before merging the first standing PR that includes
wdio_flutter:release --dry-run --skip-notes --skip-publish --skip-git --skip-github-release. Check that every tag has a matching update and thatwdio_flutter's proposed version is right. Until fix(bundler): load TS configs via workspace-local tsx, not pnpx #649's version-fallback fix lands, a package with no tags is versioned from0.1.0(it proposed0.2.0for1.0.0-next.0). Tagging the manual first publish (step 2 below) gives it a baseline either way.
Release runbook (once the above is done)
- Flip
publish.pub.enabled→trueinreleasekit.config.json. - Manual first publish: run
dart pub publishfrompackages/flutter-bridgeunder the webdriverio publisher, because pub.dev OIDC only works after the package exists. Theflutterversion group isindependent, so this publishes the pubspec's own version (currently1.0.0-next.0), not@wdio/flutter-service's. Tag itwdio_flutter@v<version>so ReleaseKit has a baseline. - On pub.dev, open the package → Admin → enable "Automated publishing from GitHub Actions" (repo
webdriverio/desktop-mobile, the release workflow). TheSetup Dartstep andid-token: writeare already wired in_release.reusable.yml. - Later versions auto-publish through ReleaseKit, on their own version line in the
independentfluttergroup with@wdio/flutter-service.
Pre-staged in #466 (ready to flip on)
version.groups.flutter(independentsince chore(release): switch framework version groups from linked to independent #498:@wdio/flutter-service+wdio_flutter),version.pub(pubspec bump), andscope:fluttercoveringwdio_flutter.packages/flutter-bridge/LICENSE(a pub.dev requirement).- The
Setup DartCI step (dart-lang/setup-dart@v1, OIDC token exchange).
Naming — verified wdio_flutter is correct
- The underscore is mandatory, not just preferred. Dart/pub.dev package names must be
lowercase_with_underscores, because the name is also the import identifier (import 'package:wdio_flutter/wdio_flutter.dart'). A hyphenatedwdio-flutterwould be rejected bydart pub publish. - It matches our
wdio-first crate family. The crates.io nameswdio-dioxus-bridge,wdio-dioxus-driverandwdio-dioxus-embedded-driverare hyphenated per cargo;wdio_flutteris the same wdio-first pattern with Dart's mandatory underscore. The Tauri crates (tauri-plugin-wdio*) are framework-first only because Tauri mandates thetauri-plugin-*prefix; Dart has no equivalent rule. - It suits the service. It's concise, available on pub.dev, and internally consistent: the pubspec
name,lib/wdio_flutter.dartand the import all agree. It needs no component suffix, because it's the single Dart contract (unlike the multi-crate Dioxus set).
Refs: #466, #642, #707, goosewobbler/releasekit#649
Activity
chore(release): revert the unpublished #642 release and fix standing-…