Changelog
Release notes for Tapsmith, generated from GitHub Releases.
Released October 14, 2026
- Accept React Native’s remaining accessibility roles in getByRole (PILOT-664)
- Infer the init –yes platform from –apk/–app and say when iOS is left out (PILOT-626, PILOT-625)
- Restore routes and event subscription when the route stream reconnects (PILOT-581)
- Bound every hook with the test timeout so a hung hook fails instead of hanging the run (PILOT-583)
- Stop init with WRITE_FAILED when a file cannot be written (PILOT-623, PILOT-624)
- Name label and state filters in Android selector descriptions (PILOT-606)
- Shard the default project’s files in a config without projects (PILOT-596)
- Run single-target UI, watch and parallel workers under the target’s device config (PILOT-654)
- Match Android RN tab, progressbar, toolbar and combobox roles in getByRole (PILOT-656)
- Decode XML entities in MCP snapshots and the locator playground (PILOT-658)
- Bound every MCP tool response so large runs no longer drop the connection (PILOT-657)
- Honour getByRole state options in MCP tools and the Locator Playground (PILOT-655)
- Make locator suggestions copy-paste safe and resolvable on device (PILOT-659)
- Cancel the init wizard cleanly on Ctrl-C instead of crashing (PILOT-518)
- Stop Android agent commands the daemon gave up on, and never queue behind them (PILOT-605)
- Match iOS getByRole heading by the header trait and RN generic views by role description (PILOT-608)
- Say when there’s no package.json before suggesting the Tapsmith install (PILOT-631)
- Recover an unresponsive Android device without restarting adb for every session (PILOT-475)
- Refuse chained calls in MCP and Locator Playground locator strings instead of dropping them (PILOT-660)
- Fix the MCP first-snapshot check’s post-reboot handshake timeouts and log where the time goes (PILOT-580)
- Make the Locator Playground and MCP snapshot match the runtime for getByLabel and WebView suggestions (PILOT-666)
- Replace a stale Tapsmith CA on Android 14+ and warn on rejected certificates (PILOT-712)
- Make getByRole(“tab”) match tab items, and “tablist” the tab bar (PILOT-514)
- Reset the app and re-run beforeAll before a retry under per-file reset (PILOT-715)
- Never kill Tapsmith emulators when adb can’t be queried (PILOT-710)
- Show the Node 22+ requirement beside the website hero install command (PILOT-634)
- Add migration guides from Maestro, Detox and Appium (PILOT-651)
- Spend fewer macOS runner slots on iOS E2E
- Automate dependency updates with Renovate
- Update Rust crate anyhow to v1.0.103 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/356
- Update Rust crate rustls to v0.23.45 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/358
- Update dependency figlet to v1.11.3 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/355
- Update dependency @modelcontextprotocol/sdk to v1.31.0 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/359
- Update dependency sharp to ^0.35.0 [SECURITY] - autoclosed by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/360
- Update Rust crate h2 to v0.4.16 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/357
- Update dependency @grpc/grpc-js to v1.14.5 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/353
- Update dependency fflate to v0.8.3 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/354
- Update dependency ws to v8.21.0 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/361
- Update dependency astro to v7 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/362
- Batch Renovate majors and lockfile refreshes into fewer PRs
- Update dependency vitest to v4 [SECURITY] by @renovate[bot] in https://github.com/tapsmith/tapsmith/pull/364
Full Changelog: https://github.com/tapsmith/tapsmith/compare/v0.6.0...v0.7.0
Released October 8, 2026
- Version the trace archive format and make its paths portable (PILOT-331)
- Parse the CLI with commander: per-command flags, uniform –help, validated trace/video modes (PILOT-260, PILOT-252, PILOT-254)
- Move the iOS commands under
tapsmith ios— breaking: old names removed (PILOT-271) - Render image bodies as pictures in the Network tab
- Boot Tapsmith-launched emulators side by side, each on a reserved port (PILOT-495, PILOT-439)
- Stop wasting cold iOS simulator setup on devicectl and a needless clear (PILOT-496)
- Record and enforce device claims across Tapsmith sessions (PILOT-381)
- Support RegExp in getByText, getByLabel and getByRole’s name, and in toHaveText/toContainText (PILOT-520, PILOT-548)
- Make exists() a non-waiting presence probe (PILOT-344)
- Promo Video workflow: render on PRs, republish on release when tools/promo changed
- Make and()/or() work on a real device (PILOT-349)
- Website: cache-bust the promo video URL
- Make all() return live nth() locators, like Playwright (PILOT-346)
- Harden live all() handles and positional composition (PILOT-346 follow-up)
- Refuse iOS taps on covered elements instead of tapping the cover (PILOT-223)
- Make the iOS reverse role map independent of Dictionary order (PILOT-365)
- Refuse Android taps on covered elements instead of tapping the cover (PILOT-362)
- Make the iOS system-proxy fallback multi-daemon safe and visible (PILOT-319)
- Honour device pins and –force-install in every run mode (PILOT-261, PILOT-313, PILOT-342)
- Refuse merge-reports merges that can’t be trusted (PILOT-257)
- Fail loudly when a config file cannot be loaded (PILOT-262)
- Run TypeScript tests from a CommonJS project without the paths[0] crash (PILOT-382)
- Fail iOS hideKeyboard() when the keyboard stays up, and stop it pressing the screen centre (PILOT-363)
- Stop merge-reports announcing “Running tests from 0 file(s)”
- Unify the –json error envelope and document every –json schema (PILOT-270)
- Make the MCP server’s tool descriptions and version tell agents the truth (PILOT-267)
- Make init prefer a capture-capable AVD and stop doctor suggesting –force over the user’s AVD (PILOT-403, PILOT-404)
- Never kill an emulator Tapsmith cannot prove it launched (PILOT-401)
- Run the other device targets when one cannot start, with advice that fits the config (PILOT-400)
- Dismiss system ANR dialogs in the Android preflight, name them in errors, and warn on the test (PILOT-398, PILOT-399)
- Upgrade glob to 13 and fail CI on install-time deprecation warnings (PILOT-405)
- Launch emulators fast locally, find the emulator binary, and report launches that die (PILOT-402, PILOT-417)
- Judge doctor’s platforms by the config, and make every fix it prints work (PILOT-263)
- Update async-trait to 0.1.92 for clippy 1.99’s double_must_use lint
- Show attached but unusable Android devices in list-devices (PILOT-432)
- Write init configs that target the iOS devices the user picked (PILOT-251)
- Drop the core packages’ postinstall and stop shipping compiled tests (PILOT-437, PILOT-438)
- Fail tapsmith verify when no test ran (PILOT-394)
- Find the npm-installed iOS device agent, check Developer Mode in ios setup-device (PILOT-264)
- Stop iOS agents when their daemon exits, and reap ones a killed daemon left (PILOT-299)
- Shut the headless MCP server down when its client closes stdin (PILOT-453)
- Count only connected physical iOS devices, with one devicectl rule in the SDK and daemon (PILOT-386, PILOT-395)
- Stream the iOS simulator agent build instead of buffering it, and build init’s agent the same way (PILOT-393)
- Name attached but unusable Android devices in test runs and MCP (PILOT-457)
- Start UI and watch mode on the device targets that can start (PILOT-415)
- Build init’s iOS simulator agent only for a plan with a simulator target (PILOT-465)
- Serve the tapsmith://api-reference MCP resource from installed packages and the repo (PILOT-359)
- Keep the daemon’s own error and the full detail in start errors (PILOT-463, PILOT-464)
- Stop iOS clearData orphaning the app container, and heal apps the agent can’t see (PILOT-462)
- Report a daemon binary spawn() refuses through the formatted start error (PILOT-490)
- Start the MCP session’s own daemon when no daemon it finds will connect (PILOT-489)
- Seed the init wizard’s build prompts from detected builds, and validate them (PILOT-513)
- Adopt only the configured simulator in parallel iOS runs (PILOT-511)
- Normalize whitespace in getByText, role names and getByLabel (PILOT-510)
- Bound the per-test idle waits so never-idle Android screens don’t delay every test (PILOT-509)
- Stop emulator launches hanging on the crash-report dialog, and never orphan a failed launch (PILOT-512)
- Fix first-run docs breakers and warn when route() handlers can never fire (PILOT-517)
- Offer to install Tapsmith from init, and say so when a config can’t import it (PILOT-551)
- Validate config keys, types and values at load (PILOT-552)
- Turn macOS App Nap off for windowed emulators so they aren’t throttled (PILOT-515)
- Add test.describe and clear errors for missing Playwright APIs (PILOT-544)
- Recognise Expo projects in tapsmith init: Expo build guidance and ids from the app config (PILOT-557)
- Match getByRole names case-insensitively by substring, with exact: true for a whole match (PILOT-549)
- Stop Node’s module-type warnings on config load, and verify’s doubled banner (PILOT-540)
- Publish prereleases under a dist-tag, and point install docs at tapsmith@beta (PILOT-541)
- Give no-toolchain advice that matches what is missing (PILOT-558)
- Support test.skip(condition, description) and runtime test.skip() (PILOT-546)
- Scaffold init’s example test as tests/example.tapsmith.ts so the project’s Jest and Vitest skip it (PILOT-554)
- Fix the getting-started Login flow example and explain per-file app reset (PILOT-555)
- Fail only the file when a test file cannot load (PILOT-545)
- Clear a stale adb forward instead of refusing iOS, and remove it when the daemon stops (PILOT-550)
- Refuse to start the CLI on Node older than 22, and state the Node floor before install (PILOT-542)
- Pick arm64 agents and AVD images under Rosetta, and warn about x64 Node (PILOT-559)
- Keep routes registered in beforeAll for every test of their scope (PILOT-534)
- Polish the init wizard: yes/no prompts, every simulator with a booted one first, verify in Next steps, .gitignore (PILOT-562)
- Resolve tapsmith test files, directories, globs and filters, and –grep, before any device work (PILOT-553)
- Reject unknown getByRole roles and fix the docs’ getByRole(“list”) examples (PILOT-556)
- Honour toBeVisible({ visible: false }) and refuse unsupported matcher options (PILOT-547)
- Refuse Yarn Plug’n’Play with the linker fix, handle pnpm’s ignored-builds exit, and document Yarn and pnpm installs (PILOT-560)
- Fail only the test when an unawaited waiter or promise rejects (PILOT-543)
- Polish first-run CLI output: config errors once, no duplicate start errors, init hint, grep filtering, retry labels, watch summary, long TMPDIR (PILOT-569)
- Make Android locator queries fast on busy apps by reading the tree-walk snapshot (PILOT-539)
- Fix CLI docs drift and guard every documented invocation against the command tree (PILOT-259)
- Pin and()/or() operand-index edge cases (PILOT-347)
- Track Claude Code project skills and add the implement-ticket workflow
- Replace the promo voiceover with ElevenLabs takes
- Add auto and merge modes to implement-ticket(s), and require a clean review before ready
- Give every wait in implement-ticket(s) a deadline
- Run CI on devices Tapsmith launches and boots itself (PILOT-483)
- Rename the selector playground to the locator playground
- Point repository URLs at the tapsmith org
Full Changelog: https://github.com/tapsmith/tapsmith/compare/v0.5.0...v0.6.0
Released September 14, 2026
- Declared app isolation, daemon reset ladder, persistent UI worker, device readiness and @tapsmith/react-native warm resets
- Capture Android Firestore traffic instead of tunnelling it by default
- Add timestamps and column sorting to the Console tab
- Multi-device tests: drive two devices in one test (PILOT-310)
- Capture live HTTP/2 streams and Firebase emulator traffic (PILOT-316, PILOT-317)
- Add opt-out anonymous telemetry to the CLI and SDK (PILOT-330)
- Never deny iOS permission prompts from the blocking-dialog sweep
- Let tonic’s Status through clippy’s result_large_err size lint
- Stop two timing tests racing the clock they are testing
- Centre UI-mode empty-state text when it wraps
- Fix the MCP servers: run TypeScript tests, report failures, and stop lying about the session
- Make screenshot pick work on actions with no captured hierarchy
- Fix startup-launch agent flake and iOS Save Password cascade in device E2E
- Make isVisible() non-waiting and add isHidden() (PILOT-287)
- Make scrollIntoView honour filter/and/or/scope and unify the resolve-tick ladder (PILOT-345)
- Retry the iOS foreground probe instead of recovering the session (PILOT-350)
- Harden Android E2E preflight, and stop system UI hiding the hooks marker
- Homepage: mobile layout fixes, Maestro-focused copy, fact-checked comparison table
- Promo video refresh, comparison-table rows, and current-UI screenshots
- Add hermetic Playwright suites for UI mode and the trace viewer
- Cover the MCP surface that only a device used to reach
- ci: cut fixed per-shard overhead in the device e2e workflows
- Assert what a generated trace file actually contains
- Add DCO contribution policy and GitHub app configuration
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.4.1...v0.5.0
Released July 30, 2026
- Attribute timeout errors to the in-flight operation; fix reporter frame filtering for npm installs
- Add promo video generation pipeline (tools/promo)
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.4.0...v0.4.1
Released July 18, 2026
- Warm in-process deep-link delivery on iOS simulators, bounded by cold file boundaries (PILOT-249)
- Add element pick mode to the live device mirror in UI mode
- Guide users off Google Play AVD images that silently break HTTPS capture
- Extend strict mode to WebView locators (PILOT-227)
- Surface UI/watch startup failures instead of silently exiting 1 (PILOT-253)
- Ride out transient agent-connection drops in test runs (PILOT-282)
- Make scrollIntoView a reliable no-op on already-visible elements (PILOT-283)
- Render a reset-epoch marker so warm same-screen iOS resets verify as delivered
- Keep long MCP test runs alive with progress notifications and add a session-wide suite status tool
- Record no assertion bounds when the element is hidden or gone
- UI mode: keep a finished test’s status and trace when afterAll re-tags attribution
- Include beforeAll and afterAll actions in packaged test traces
- Dismiss the Android soft keyboard with BACK instead of ESCAPE (PILOT-284)
- Bound and retry iOS WebView connection setup; probe newest targets first (PILOT-288)
- Make E2E CI resilient: fix every root-caused flake across SDK, daemon, and agents
- Render website changelog as flat bullet lists (no categorisation)
- Refresh website/docs screenshots and add click-to-enlarge
- Speed up iOS E2E shard setup: cache npm and overlap simulator boot
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.3.5...v0.4.0
Released July 3, 2026
- Fence zombie test bodies and ship the failed attempt’s trace on flaky results
- Cut Android agent per-action a11y round-trips from ~15 to 0-2 (PILOT-278)
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.3.4...v0.3.5
Released July 2, 2026
- Add retain-on-failure-and-retries trace/video mode (Playwright parity)
- Retry transient agent-command timeouts within the action budget
- Fix the systematic E2E CI flakes across all four components
- Automate releases + publish notes to GitHub Releases and website changelog
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.3.3...v0.3.4
Released July 2, 2026
- Tunnel embedded-root gRPC (Firestore) that aborts the MITM handshake
- Don’t gate Android element queries on global UI idle
- Default to the list reporter everywhere, including CI
- Make single-test filtering intuitive and fail-loud
- Fix list_results dropping all but the last file in multi-file runs
- Add –project flag to the CLI
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.3.2...v0.3.3
Released July 2, 2026
- Address positional/filtered actions by agent-cached element id
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.3.1...v0.3.2
Released July 2, 2026
- Preserve Android auth (keystore) + runtime permissions across appState restore
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.3.0...v0.3.1
Released July 2, 2026
- Fix npm ci sync failure after release: decouple committed @tapsmith dep versions
- Allow getBy*/locator() scoping off modified handles
- Preserve AndroidKeyStore on app-state restore; add device.platform getter
- docs: correct Android appState keystore behavior + cross-device limitation
- Trace element-action auto-wait so failures are attributed correctly (PILOT-244)
- Handle Firestore HTTP/2 cert rejects with passthrough
- Show pending state for MCP-initiated test runs in UI mode
- Trust the MITM CA on Android 14+ via the Conscrypt APEX store
- Fix route.abort() hanging instead of failing the request (PILOT-248)
- Fix literal … rendering in container “Run” button
- LLM-friendly setup: non-interactive init, doctor –json, verify command
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.2.0...v0.3.0
Released July 2, 2026
- Pin website deploy to production branch on Cloudflare Pages
- Strict mode for locators + runtime-true selector validation (PILOT-226)
- Capture iOS simulator keychain in app state save/restore/clear (PILOT-220)
- Tunnel HTTP/2-only and pinned-host TLS connections instead of dropping them (PILOT-231)
- Make stop actually stop tests immediately, with SIGKILL escalation for wedged workers (PILOT-222)
- Stop no longer leaks video recording + network capture on the daemon (PILOT-235)
- Live progress feedback during long device actions (PILOT-232)
- Video on-first-retry: startup warning, docs, and CI switch (PILOT-240)
- Stop dispatcher crashing with unhandled EPIPE when a worker dies mid-run (PILOT-228)
- Fix trace viewer not deploying to production on tag push
- Fix empty Source tab for in-progress actions in UI mode (PILOT-233)
- Retry transient stale snapshots during pre-action element resolution
- Tear down child resources when the dispatcher crashes (PILOT-230)
- Fix UI-mode MCP single-session transport; add multi-client support (PILOT-221)
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.1.8...v0.2.0
Released July 2, 2026
- Fix iOS simulator agent npm packages shipping without the app bundle
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.1.7...v0.1.8
Released July 2, 2026
- Auto-retry Android agent install on signature mismatch
- Fix explicit test files only running against first matching project
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.1.6...v0.1.7
Released July 2, 2026
- Fix CJS/ESM dual-instance crash in test runner
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.1.5...v0.1.6
Released July 2, 2026
- Fix iOS agent startup race with concurrent app install
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.1.4...v0.1.5
Released July 2, 2026
- Fix: strip DSTROOTPath from auto-built iOS simulator xctestrun
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.1.3...v0.1.4
Released July 2, 2026
- Skip optional deps in CI workflows to prevent lockfile mismatch
- Extract Android agent into separate @tapsmith/agent-android package
- Auto-build iOS simulator agent on SDK version mismatch
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.1.2...v0.1.3
Released July 2, 2026
- Skip already-published release packages
- Show in-flight action in UI mode Actions tab (PILOT-200)
- Fix HTTPS scheme in Android network capture + auto-launch emulators when AVD set
- PILOT-114: Add video recording of test execution
- PILOT-189: Support cross-origin redirection in route.continue({ url })
- Add –grep and –grep-invert CLI flags
- PILOT-193: Stream device logs into Console tab
- Add elementHandle.waitFor() for waiting on element state
- Add getByLabel() for locating inputs by label text
- Add checked, disabled, selected, expanded options to getByRole()
- Add isEditable() query method on ElementHandle
- Add sharded Android E2E tests to CI
- Fix 30 performance, robustness, and flakiness issues
- PILOT-205: Replay full run state on WebSocket reconnect
- Improve iOS reliability and harden CI against transient flakes
- Add configurable double-tap interval
- Mitigate CI flakes: session recovery retry, test hardening, accessible locators
- UI Mode v2 design overhaul + bug fixes
- Implement test retries for failed tests
- Add recovery for agent connection drops during between-file reset
- Support getByRole for non-button roles on Android
- Trace viewer v2 redesign to match UI Mode
- Respect –workers as a hard cap on total worker count
- Selector playground: suggest getByRole for trait-based roles (PILOT-216)
- Fix launchEmulators inference for per-project use blocks
- Fix ANR dialog detection failing on ASCII apostrophes
- MCP server: multi-daemon discovery for cross-platform devices (PILOT-218)
- Improve Tapsmith launch progress output
- Ship prebuilt iOS simulator agent as npm packages (PILOT-203)
- Comprehensive documentation overhaul
- Fix iOS CI flakes: atomic doubleTap, robust restartApp, session recovery
- Headless MCP server: full test dispatcher with CLI activity logging
- Migrate MCP server from SSEServerTransport to Streamable HTTP (PILOT-204)
- Polish launch progress output
- Add Tapsmith documentation website
- Add ephemeral preview deployments for website PRs
- Add deployment workflows for trace viewer
- Reference trace.tapsmith.dev in docs
- Install MITM CA into system trust store on Android emulators (PILOT-198)
- Redesign landing page with new branding and content improvements
- Fix UI mode live test discovery
- Fix trace action wall durations
- Stream test results immediately instead of buffering per-file
- Match Playwright list reporter output format
- Fix flaky tests
- Implement reset app deep link in E2E
- Exclude caches from app state archives for faster save/restore
- Refactor E2E tests: screen fixtures and deeplink navigation
- Persistent TCP connection to on-device agent
- Fix list reporter duplicate in-progress lines in single-worker mode
- Make tapsmith SDK ESM-first
- Add Tapsmith branding and website-matched dark theme to UI mode & trace viewer
- Type-check the web apps and lint the trace viewer in CI
- Resolve test-scoped fixtures in beforeAll/afterAll hooks
- UI mode Source tab reads actual source files (Playwright-style)
- Interactive device mirror in UI mode (tap/swipe/long-press/text)
- docs(ui-mode): document the interactive device mirror
- Stream daemon logs into trace files (trace.daemonLogs)
- Fix iOS deep-link Open prompt flake
- Guard iOS inputText typing
- Use photographic device bezels in UI mode and the trace viewer
- Fix UI mode: hard-refresh no longer starts a test run
- Remove live video stream from the device mirror (screenshot-only)
- Speed up iOS e2e: skip blind settle wait + add timing instrumentation
- Add batched captureTraceState command to reduce iOS trace overhead
- Fix chronic iOS auth.setup attempt-1 deep-link flake
- perf: startup optimisations (CI + local)
- Fix iOS simulator agent build in release workflow
- Use npm install for tapsmith publish step in release
Full Changelog: https://github.com/samsmithyeah/tapsmith/compare/v0.1.1...v0.1.2
Released July 2, 2026
- Add CI pipeline, 195 unit tests, and quality gates
- Add 13 locator assertions for Playwright API parity (PILOT-3)
- Add generic value assertions, expect.soft(), and expect.poll()
- Add Locator API enhancements (PILOT-1)
- Setup improvements
- Add element action methods (PILOT-2)
- Add device management APIs (PILOT-10, 11 stories)
- Add test app, E2E suite, and test isolation
- Add test reporter system with 8 built-in reporters (PILOT-7)
- Add parallel execution, CI sharding, and emulator auto-provisioning
- Add trace viewer with recording pipeline, viewer UI, network capture, and CLI (PILOT-85)
- Add test.use() to override options per describe scope (PILOT-50)
- Add app state snapshot/restore and projects (PILOT-115)
- Add –watch CLI flag for re-running tests on file change (PILOT-120)
- Add interactive UI mode for test running and debugging (PILOT-87)
- Fix parallel test flakiness with scrollIntoView, file isolation, and trace optimizations
- Add iOS simulator support via XCUITest agent
- Replace selector builders with Playwright-style getBy* locators
- Add device-per-project support for multi-platform testing
- Replace macOS system proxy with per-simulator NE redirect (PILOT-182)
- Physical iOS device support (PILOT-185)
- Add API request fixture for test data seeding (PILOT-121)
- Feat/network route interception
- UI mode UX overhaul: network detail pane, watch scoping, errors tab, assorted polish
- Fix known selector + assertion bugs (PILOT-131, 132, 133, role/text/empty)
- Fix iOS network mocking test flakiness
- Selector playground for trace viewer and UI mode
- Add WebView testing support for hybrid apps (PILOT-116)
- Add MCP server for LLM/agent integration
- Rename Pilot to Tapsmith
- Add npm packaging, init wizard, and doctor command
- Fix cross-compilation for linux-arm64 daemon build
- Vendor protoc for cross builds
- Make release versioning idempotent
Full Changelog: https://github.com/samsmithyeah/tapsmith/commits/v0.1.1

