Skip to content

Releases: AlphaWaveSystems/flutter-probe

v0.9.9

13 May 06:48

Choose a tag to compare

Added

  • deliver signal "name" ["value"] — new ProbeScript step that resolves
    a pending awaitSignal(name) call in the Flutter app. Use to unblock any
    OS-level interaction that isn't in the Flutter widget tree: push permission
    dialogs, payment sheets, App Tracking Transparency, deep-link handlers, etc.
    The value defaults to "true" when omitted.
  • awaitSignal(String name) — new public function exported from
    flutter_probe_agent. Returns a Future<String> that resolves with the
    value sent by the CLI. Generalises the awaitBiometricResult() pattern to
    any named signal.
  • DeliverSignal(String name, {String value}) — new annotation step class
    in flutter_probe_annotation. Emits deliver signal "name" or
    deliver signal "name" "value".
  • Parser: TOKEN_DELIVER, TOKEN_SIGNAL, VerbDeliverSignal.
  • Agent: probe.signal JSON-RPC method, ProbeMethods.signal constant.

v0.9.8

13 May 02:45
88ee2da

Choose a tag to compare

Fixed

  • Biometric no-match on iOS 26+ simulatornotifyutil no-match notifications
    no longer resolve LAContext.evaluatePolicy on iOS 26 / Xcode 26.5. The CLI now
    sends a probe.biometric_signal {result: bool} JSON-RPC command to the agent
    after firing platform-level notifications. Test apps call awaitBiometricResult()
    from flutter_probe_agent instead of local_auth.authenticate() in PROBE_AGENT
    builds; the agent resolves a Dart Completer with the CLI-delivered result, making
    biometric no-match reliable on all iOS simulator versions.

Added

  • awaitBiometricResult() — new public function in flutter_probe_agent.
    Returns a Future<bool> that resolves when the CLI delivers
    probe.biometric_signal. Usage pattern in test apps:
    final ok = const bool.fromEnvironment('PROBE_AGENT')
        ? await awaitBiometricResult()
        : await localAuth.authenticate(...);
  • probe.biometric_signal — new JSON-RPC method. Sent by the CLI after
    the platform-level biometric simulation commands so the result is always
    delivered regardless of simulator version behavior.

v0.9.7

13 May 01:35
ab5e4b2

Choose a tag to compare

Added

  • Biometric authentication testing — three new ProbeScript steps that drive Face ID / Touch ID / fingerprint flows on iOS Simulator and Android emulator without real hardware. Skipped on physical devices with a warning (same pattern as set location and other simulator-only ops).
    • enroll biometric — marks the simulator/emulator as having an enrolled face or finger. iOS posts the com.apple.BiometricKit.enrollmentChanged Darwin notification via xcrun simctl spawn booted notifyutil. Android requires the fingerprint to be pre-enrolled in Settings.
    • biometric match — simulates a successful capture, satisfying any pending biometric prompt. iOS posts *_Sim.faceCapture.match AND *_Sim.fingerTouch.match so the same step works on Face ID and Touch ID devices. Android runs adb -s <serial> emu finger touch 1.
    • biometric no match — simulates a failed capture so the app's "authentication failed" path can be tested. iOS posts the .no-match variants; Android runs adb emu finger touch 9999 (an unregistered id).
    • Annotation DSL: matching EnrollBiometric(), BiometricMatch(), BiometricNoMatch() const Step classes in flutter_probe_annotation, with a new biometric_auth golden fixture in flutter_probe_gen/test/fixtures/ that round-trips through the Go parser via the cross-language integration test.
    • Parser: 2 new tokens (TOKEN_BIOMETRIC, TOKEN_ENROLL), 3 new ActionVerb constants, 2 new parser dispatch cases. 3 new unit tests in parser_test.go.
    • Runner: EnrollBiometric / BiometricMatch / BiometricNoMatch methods on DeviceContext, dispatch cases in Executor.runAction, and human-readable strings in stepDescription.
    • Docs: new section in annotations.md and syntax.md on the website. Per-package CHANGELOGs updated.

v0.9.6

13 May 00:46
61f0a17

Choose a tag to compare

Fixed

  • flutter_probe_gen: Mock path silently truncated. The emitter wrote the path unquoted (when the app calls GET /api/products), so the Go lexer split on / and the parser only recorded the first IDENT segment. Now emits the canonical quoted form. Caught by a new mock_and_call golden + the existing cross-language integration test.
  • flutter_probe_gen: See suffixes silently dropped. When state, containing, and matching were all set on a single assertion, only the last branch's text reached the output. Now composes all three suffixes additively: see "x" is enabled contains "y" matching "z". Caught by a new see_states golden covering the matrix.

Added

  • flutter_probe_annotation: @ProbeCompositeTest annotation. The flagship multi-device composite testing feature finally has a DSL surface. Pair with Device(alias, target: …), OnDevice(alias, steps: […]) per-device groups, and Sync(label) cross-device barriers. Emitter generates standard composite test / devices / <alias>: / sync blocks that the existing CLI runner picks up unchanged.
  • flutter_probe_annotation: See.id / See.selector factories — assertions can now target by ValueKey or any rich selector (Ordinal, Below/Above/LeftOf/RightOf, InContainer, TypeSel) rather than only by literal visible text. Same factories on DontSee. The Go parser always supported this; the DSL just didn't expose it.
  • flutter_probe_annotation: WaitUntil.idAppears / .idDisappears — emits unquoted #key selector form (Go parser's WaitSelector branch), which is more reliable than text matching for stable ValueKey-tagged widgets.
  • flutter_probe_gen: 6 new golden fixtures. mock_and_call, see_states, composite_chat, wait_variants, examples_inline, kitchen_sink. The kitchen sink fixture exercises one of every step, selector kind, and control-flow construct. Every fixture round-trips through internal/parser/golden_integration_test.go. Total golden coverage went from 4 → 10 fixtures, builder tests from 5 → 11.

Changed

  • flutter_probe_annotation: Press and Pinch are now @Deprecated. The Go parser has no press or pinch case, so emitted text fell through to parseRecipeCall and was misinterpreted. Marked deprecated until runtime support lands. Use GoBack() in place of Press('back').
  • flutter_probe_gen: emitter no longer coupled to enum declaration order. _direction, _httpMethod, and the See state lookup now read the enum constant identifier (_name field) instead of indexing a hard-coded array by .index. Reordering Direction, HttpMethod, or SeeState no longer silently corrupts emitted ProbeScript.

Docs

  • New website page: Annotation-driven Tests — full reference for the annotation DSL with every step class, selector kind, and the new composite test syntax.

v0.9.5

13 May 00:13
8187d54

Choose a tag to compare

Fixed

  • Dart agent: iOS / Impeller screenshotstake_screenshot previously called OffsetLayer.toImage() on the root render view. On iOS with the Impeller renderer (Flutter's default on iOS 17+), that returns a GPU-backed texture whose toByteData(ImageByteFormat.png) is null, so capture silently produced nothing. The agent now primarily captures via the largest visible RenderRepaintBoundary in the widget tree (Impeller-supported); the legacy OffsetLayer path is only used as a fallback when no boundary is found (Skia). Also awaits WidgetsBinding.instance.endOfFrame before capture so the latest frame is always in the image, and uses the actual View.devicePixelRatio rather than a hard-coded 2.0.

v0.9.4

10 May 02:46
c4082c8

Choose a tag to compare

Added

  • Claude Desktop Extension (.mcpb)probe-mcp is now packaged as a one-click Claude Desktop Extension. Users drag flutter-probe-<platform>-<arch>.mcpb onto Claude Desktop's Extensions settings, pick their Flutter project directory, and all 18 MCP tools are available. No brew install, no JSON config editing, no PATH setup. CI builds and attaches .mcpb artifacts for darwin-arm64, darwin-amd64, linux-amd64, and windows-amd64 to every release.
    • Manifest declares server.type: "binary" and bundles the platform-specific probe-mcp executable.
    • user_config.projectRoot is a directory picker surfaced as the PROBE_PROJECT_DIR env var.
    • probe-mcp reads PROBE_PROJECT_DIR at startup and os.Chdirs into it so run_tests, list_files, get_report, and init_project resolve paths against the user's Flutter project rather than Claude Desktop's working directory.
    • scripts/build-mcpb.sh produces a bundle locally from any built probe-mcp binary; uses npx @anthropic-ai/mcpb for schema validation and packing.
    • New build-mcpb job in .github/workflows/release.yml runs after build, downloads the per-platform probe-mcp artifacts, packs them into .mcpb bundles, and attaches them to the GitHub release.

v0.9.3

10 May 01:37
168264f

Choose a tag to compare

Added

  • Annotation-driven test generation — two new Dart packages, flutter_probe_annotation and flutter_probe_gen, let you declare ProbeScript end-to-end tests as decorators on your Flutter screen classes. A build_runner builder reads the annotations at build time and emits matching .probe files into tests/generated/, picked up unchanged by probe test.
    • Annotation API: @ProbeSuite, @ProbeTest, @ProbeRecipe plus a fully type-checked step DSL covering all 31 ProbeScript action verbs (Tap, Type, See, Wait, Swipe, Scroll, Drag, Restart, Kill, ClearAppData, permissions, clipboard, location, screenshots, etc.), all 6 selector kinds (text, id, type, ordinal, positional, relational), hooks (beforeEach, afterEach, beforeAll, afterAll, onFailure), loops (Repeat), conditionals (If/otherwise), recipes with named parameters, data-driven Examples, HTTP mocks (Mock), and inline Dart blocks (RunDart).
    • Builder: declares lib/{{}}.darttests/generated/{{}}.probe. Cheap text pre-check skips files without annotations so it's safe to enable on a whole lib/ tree. Each annotated class becomes a top-level test "..." block with optional tags and step body.
    • Cross-language validation: every Dart-emitted golden is parsed by the Go-side parser in CI (internal/parser/golden_integration_test.go), so a malformed emitter line is caught immediately rather than at user runtime.
    • Docs: see docs/wiki/Annotations.md for the full reference.

v0.9.2

10 May 00:52
c97b2df

Choose a tag to compare

Added

  • Real-time step feedback — the runner now emits progress during test execution instead of staying silent until a step completes:
    • Pre-step indicator (verbose mode): prints → step description immediately before each step runs. On a TTY the line is overwritten in place by the ✓/✗ result when the step finishes (clean single-line-per-step output). On non-TTY (CI) both lines are appended.
    • Progress ticker (all modes): a goroutine fires every 5 seconds while a step is still running and prints ⏱ step... (Ns). Stops immediately when the step completes — fast steps produce no ticker output.
    • Timeout warning (all modes): when a step has consumed ≥ 80% of its context deadline, a one-time ⚠ step still running — Ns elapsed, Ns timeout warning is printed. Gives time to react before the step times out.
    • Non-verbose TTY status line: even without --verbose, a faint \r-overwriting status line shows the current step name while it runs and is cleared when it finishes. No output on non-TTY so CI logs stay clean.

v0.9.1

09 May 19:22
b6318b5

Choose a tag to compare

Added

  • MCP: 3 new toolsinit_project (scaffold probe.yaml + tests/), generate_report (HTML from JSON results), record (record interactions → .probe file with configurable timeout)
  • MCP: Android emulator shutdownshutdown_device now accepts serial for Android emulators in addition to udid for iOS simulators
  • MCP: composite test supportrun_tests exposes a composite_devices parameter ("A=host:port/token B=udid") that maps directly to --composite-device flags; write_test description documents the full composite test syntax
  • MCP: run_tests flags documented — tool description now enumerates key flags (--timeout, --format, --parallel, --shard, --host/--token, --disable-animations, --video, --stream)
  • MCP: write_test validates before writing — content is parsed in-process before the file is created; syntax errors are returned immediately without touching the filesystem

Fixed

  • MCP: get_report used alphabetical order instead of modification timeget_report and generate_report now find the most recently modified JSON file in reports/, not the lexicographically last one

v0.9.0

09 May 19:05
9465643

Choose a tag to compare

Added

  • Composite tests — a new composite test keyword lets a single .probe file orchestrate multiple devices simultaneously. Declare device aliases (A, B, C, …), write per-device step blocks (A: tap "Login"), and use sync "label" as a cross-device barrier that all goroutines must reach before any proceeds. Supports N devices. Files with composite tests coexist with regular test blocks. Configure devices via --composite-device A=host:port/token (WiFi), --composite-device B=<udid> (iOS simulator), or --composite-device C=emulator-5554 (Android). Probe.yaml can also set composite.devices for project-level defaults. If composite devices are not configured at runtime, composite tests are reported as SKIPPED.
  • Failure semantics: if one device fails mid-test, the shared context is cancelled immediately; all other devices are unblocked from any sync barrier they are waiting at and their next step returns a cancelled error. The final result marks the root cause device as FAIL and secondary devices as CANCELLED.