All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
- Homebrew tap:
brew tap AlphaWaveSystems/tap && brew install probe(macOS + Linux) - Homebrew formula auto-updates on every release tag via
HOMEBREW_TAP_TOKEN
flutter_probe_agentDart package re-licensed from BSL 1.1 to MIT (Go CLI remains BSL 1.1)- CI: added Dart agent validation job —
dart analyze,flutter test,dart pub publish --dry-run, CHANGELOG enforcement - CI: added PR template with pub.dev and docs checklist
- Automated pub.dev publishing via GitHub Actions using official
dart-lang/setup-dartreusable workflow - FAQ section on landing page (WiFi testing, physical devices, CI/CD, setup)
- ProbeScript Dictionary — complete reference of all keywords, commands, and modifiers
- Comprehensive third-party tool requirements documentation
- Renamed Dart package from
probe_agenttoflutter_probe_agentfor pub.dev branding - Publish workflow chains after Release workflow (prevents publishing broken versions)
- Version badge auto-updates from git tags (no more hardcoded versions)
- Broken wiki link on landing page (
AlphaWaveSystems/wiki→flutter-probe/wiki) - Old domain references (
flutterprobe.com→flutterprobe.dev) - Old package name references in vscode README and docs
- pub.dev score: shorter description, dartdoc warning, clean public API
- Pre-shared restart token (
probe.set_next_token) — CLI sends a token to the agent beforerestart the app; agent persists it and uses it after restart, enabling WiFi reconnection withoutidevicesyslog --hostflag for WiFi testing — connect directly to device IP, no iproxy needed--tokenflag to skip USB-dependent token auto-detectionPROBE_WIFI=truedart-define — binds agent to0.0.0.0for network access- HTTP POST fallback transport (
POST /probe/rpc) — stateless per-request communication for physical devices ProbeClientinterface — both WebSocket and HTTP clients satisfy it for transport-agnostic executiontap "X" if visibleProbeScript syntax — silently skips when widget is not found; works with tap, type, clear, long press, double tap- Direct
onTapinvocation fallback forSemantics-wrappedGestureDetectorwidgets on physical devices take screenshot "name"now accepts name directly (nocalledkeyword needed)- Physical device E2E test suite for FlutterProbe Test App (12 tests covering all 10 screens)
clear app dataon physical iOS now skips immediately (before confirmation prompt) to avoid killing the agent- Connection error detection in
if visible— propagates connection errors for auto-reconnect instead of silently swallowing them - Screenshot parser accepts
take screenshot "name"without requiringcalledkeyword
- Physical iOS device support: launch/terminate via
xcrun devicectl, token reading viaidevicesyslog, port forwarding viaiproxy - Physical Android device validation:
EnsureADB()verifies binary, device reachability, and cleans stale port forwards - Physical device detection:
IsPhysicalIOS(simctl list check) andIsPhysicalAndroid(ro.hardware property check) - Physical iOS devices listed in
probe device listviaidevice_id - WebSocket ping/pong keepalive (5s interval) — prevents idle connection drops on physical devices via iproxy
- Auto-reconnect on WebSocket connection loss — up to 2 transparent retries per step with full re-dial
EnsureIProxy()— automatic iproxy lifecycle management: checks installation, kills stale processes, starts fresh, defers cleanup- Visibility filtering in widget finder — off-screen widgets (behind routes, Offstage, Visibility) no longer match
see/if appears - Unique pointer IDs for synthetic gestures — prevents collision with real touch events on physical devices
- ProbeAgent profile mode support —
ProbeAgent.start()works in profile builds (required for physical iOS) - ProbeAgent release mode safeguards — blocked by default, opt-in via
allowReleaseBuild: true+PROBE_AGENT_FORCE=true - Test files for all packages:
cmd/probe,internal/cli,internal/ios,internal/device(manager tests) - HTTP POST fallback transport (
POST /probe/rpc) — stateless alternative to WebSocket for physical devices, eliminates persistent connection drops ProbeClientinterface — both WebSocketClientandHTTPClientsatisfy it, enabling transport-agnostic test execution- WiFi testing mode (
--host <ip>+--token <token>+--dart-define=PROBE_WIFI=true) — test physical devices without USB, no iproxy needed tap "X" if visibleProbeScript syntax — silently skips tap when widget is not found, replaces verbose dialog-dismissal recipes- Direct
onTapinvocation fallback forSemantics-wrapped widgets — fixes tap failures on physical devices where synthetic gestures don't reachGestureDetector take screenshot "name"now accepts name directly (previously requiredcalledkeyword)
- Operations unsupported on physical devices now skip gracefully with warnings instead of crashing:
clear app dataon physical iOS → warning + skipallow/deny permissionon physical iOS → warning + skipset locationon any physical device → warning + skip
restart the appon physical iOS usesxcrun devicectlinstead ofsimctl- iOS connection setup now branches: simulator path uses simctl permissions + loopback; physical path uses iproxy + idevicesyslog
- Android connection setup validates ADB availability and device state before port forwarding
- Cross-platform parallel E2E execution:
--parallel --devices emulator-5554,<iOS-UDID>runs tests on iOS + Android simultaneously ResolveAppID: auto-converts camelCase iOS bundle IDs to snake_case Android package names for cross-platform runs- Per-device
AppIDfield inDeviceRunfor mixed-platform parallel testing - Retry logic for parallel device connections (up to 2 retries with 5s backoff)
- Graceful per-device error handling — one device failing doesn't stop others
- Custom domain: site now lives at flutterprobe.dev
- SEO overhaul: sitemap.xml, robots.txt, JSON-LD structured data, Twitter Cards, OG image
- 7 comparison pages targeting search intent (Flutter E2E testing, integration_test alternative, Patrol alternative, etc.)
- 3 blog posts (Flutter E2E testing guide, Why We Built FlutterProbe, honest comparison)
- Copilot Code Review configuration with path-specific review instructions for parser, runner, agent, website, and CI
- Dependabot compatibility workflow: security audit (
govulncheck,npm audit), license compliance (rejects GPL/AGPL/SSPL), backward compatibility (.probe file parsing), auto-merge for patch/minor updates - Headless E2E CI/CD: fully wired Android (ubuntu + emulator) and iOS (macOS + simulator) workflows with 3-way sharding, automated app build/install/launch, and HTML report generation
- Parallel port assignment: Android gets
portBase+1via ADB forward, iOS usesportBasedirectly - Landing page version badge updated to current release
- Fix
set locationdecimal parsing — coordinates like37.7749, -122.4194were stripped of decimals and negative signs - Fix Android app launch — replace
adb shell monkeywitham start -n {package}/.MainActivity(monkey fails silently on many emulators) - Fix Android token reading — file-based token via
adb shell run-asinstead of unreliable logcat scanning - Fix variable resolution in
seeassertions — data-driven variables like<expected>were not substituted - Fix Dart agent url_launcher interceptor — use proper
MethodChannel.setMethodCallHandlerinstead of mock-only API - Increase Android reconnect delay to 5s (emulators need more boot time than iOS simulators)
--parallelflag — auto-discover all connected devices, distribute test files round-robin, run in parallel goroutines--devices serial1,serial2flag — explicit device list for parallel execution--shard N/Mflag — deterministic file-based sharding for CI matrix jobs (e.g.--shard 1/3)ParallelOrchestratorwith per-device goroutines, independent WebSocket connections, port allocation, and result merging- Per-device test attribution —
TestResultincludesDeviceIDandDeviceName - JSON reporter includes
device_idanddevice_nameper result - Terminal output shows per-device summary table in parallel mode
- Lexer support for float literals (e.g.
37.7749) and negative sign tokens
before all/after allhooks for suite-level setup and teardown (run once per file)kill the appcommand — force-stop without relaunch (CLI-side via ADB/simctl)open the appnow performs CLI-side launch + reconnect when device context is availablecopy "text" to clipboardandpaste from clipboardcommands (agent-side via Dart Clipboard API)set location lat, lngcommand — set device GPS coordinates (ADB geo fix / simctl location)verify external browser openedcommand — checks url_launcher platform channel for external launchescall GET/POST/PUT/DELETE "url"command — execute real HTTP requests from tests (Go-side net/http)call ... with body "json"— HTTP calls with request body, response stored in<response.status>and<response.body>variables<random.email>,<random.name>,<random.phone>,<random.uuid>,<random.number(min,max)>,<random.text(length)>data generators for form-heavy testswith examples from "file.csv"— load data-driven test data from external CSV files- Unit tests for random data generators, CSV loader, all new parser commands
- E2E test files for all new features: hooks, clipboard, app lifecycle, location, random data, HTTP calls, CSV-driven tests
- Resolve all pre-existing staticcheck lint errors blocking CI
- Replace deprecated Go 1.26 crypto/ecdsa field access with ecdh+x509 round-trip in wallet signing
- Remove unused functions and variables across CLI, runner, and probe-convert packages
- Fix error string style violations (punctuation, numeric HTTP status codes, nil context)
- Unit tests for 6 previously untested packages: config, plugin, visual, report, device, cloud/wallet
- Test coverage for config loading/validation, plugin registry, visual regression comparison, HTML report generation, permission resolution, and wallet operations
- Bump GitHub Actions: actions/checkout v5→v6, actions/upload-artifact v4→v7, actions/setup-node v4→v6, actions/upload-pages-artifact v3→v4, codecov/codecov-action v4→v5
- Cloud device farm integrations: BrowserStack, Sauce Labs, AWS Device Farm, Firebase Test Lab, LambdaTest
- WebSocket relay mode for cloud device farms with session TTL and auto-connect
- x402 payment protocol support for cloud API billing (EIP-712 wallet signing)
- VS Code extension: Session Manager sidebar for multi-device parallel testing
- VS Code extension: Test Explorer sidebar with workspace-wide test discovery
- VS Code extension: CodeLens inline Run/Debug buttons above tests
- VS Code extension: real-time diagnostics (lint-on-save) and IntelliSense completions
- VS Code extension: Run Profile webview panel for configuring test options
- Physical iOS device support via iproxy (libimobiledevice)
probe studiocommand for interactive widget-tree inspectionprobe generatecommand for AI-assisted test generation (Claude API)probe healcommand for self-healing selector repair with AI analysisprobe migratecommand for converting tests from other frameworks- Landing page and Astro/Starlight documentation website
- Cloud relay configuration in probe.yaml (TTL, connect timeout, auto-enable)
- AI configuration in probe.yaml (API key, model selection)
- ProbeScript language with indent-based natural language test syntax
- Go CLI with commands: test, lint, init, device, record, report, migrate, generate
- Dart ProbeAgent with WebSocket JSON-RPC 2.0 protocol and direct widget-tree access
- iOS simulator support with token file fast path and log stream fallback
- Android emulator support with ADB port forwarding and logcat token extraction
- Sub-50ms command round-trip execution
- Recipe system with parameterized reusable steps and
useimports - Data-driven tests with
Examples:blocks and variable substitution before each,after each, andon failurehooks- Conditional execution with
if/elseblocks repeat N timesloops- Visual regression testing with configurable threshold and pixel delta
- Test recording mode capturing taps, swipes, long presses, and text input
- Custom plugin system via YAML definitions
- probe-convert tool supporting 7 source formats at 100% construct coverage
- Supported formats: Maestro, Gherkin, Robot Framework, Detox, Appium (Python/Java/JS)
- VS Code extension with syntax highlighting, snippets, and commands
- HTML, JSON, and JUnit XML report generation with relative artifact paths
- Self-healing selectors via fuzzy matching (text, key, type, semantic strategies)
- HTTP mocking with
when ... respond withsyntax - App lifecycle commands:
clear app data,restart the app - OS-level permission handling via ADB and simctl
- Configurable tool paths for ADB and Flutter binaries
- Parallel testing support with per-platform config files
- Video recording on iOS (H.264) and Android (screenrecord/scrcpy)
- Dart escape hatch with
dart:blocks - probe.yaml configuration with full resolution order (CLI flag > YAML > default)