fdb 1.13.0
fdb: ^1.13.0 copied to clipboard
Flutter Debug Bridge - CLI for AI agents to interact with running Flutter apps on device. Launch, reload, screenshot, inspect widget tree, filter logs.
1.13.0 #
Improvements #
fdb launch --timeout <seconds>sets how long launch waits for the app to start. The default is now 600 seconds (was 300), because first debug builds of large apps often take longer.fdb attach --timeoutworks the same way (default stays 300). Invalid values printERROR: Invalid value for --timeout: <value>.fdb launchandfdb attachclean up a dead previous session on their own. If the previous app is gone or its controller does not answer, they stop the leftover controller, flutter tool and log collector processes, remove the stale session files and printWARNING: Cleaned up a stale session .... You no longer needfdb killor to delete.fdb/first.fdb describemarks disabled widgets:@N ElevatedButton(disabled) "Send"(JSON:enabled: false). Lines for enabled widgets are unchanged.fdb describerefs are now stable IDs, modelled on agent-browser's element refs.@Nnames one widget instance: it keeps its ref across describes while it stays mounted (scrolling, rebuilds, state changes, a dialog on top), and refs are never reused while the app runs (hot restart starts again at@1). A widget that is removed or replaced gets a new ref, and its old one fails withERROR: @N is stale: the widget was removed or rebuilt. Run fdb describe again.instead of reaching whatever widget now sits at that position. Describe lines stay in top-to-bottom order, so numbers are no longer 1..n. A list child that is not built yet keeps its ref whenfdb scroll-to @Nbrings it into view; tapping it before that fails withERROR: @N is not built on screen. .... The describe JSON lists refs of the previous describe that went stale inremovedRefs.fdb longpress,double-tap,scroll-toandinputaccept@Ntoo (fdb input @3 "text"). A ref can't be combined with--key/--text/--type/coordinates.- New
fdb tap @N --expect-text <text>and--expect-type <type>: fail without tapping if the widget behind the ref no longer shows that text or has that type (a "Follow" button that now reads "Unfollow"):ERROR: @4 is now TextButton "Delete", not "Save". Nothing was tapped. Run fdb describe again.--expect-textmatches the widget's text or one of its·-separated parts. fdb tap @Nappends the widget's text to the success line:TAPPED=ElevatedButton X=196.0 Y=410.0 TEXT="Save".@Nneeds the updated fdb_helper. With an older one, commands with@Nfail withERROR: fdb_helper in the app is too old for @N refs. ...and tap nothing.fdb describewarns on stderr when the running app'sfdb_helperdiffers from the version the project resolves (.dart_tool/package_config.json):WARNING: The app runs fdb_helper X but the project resolves Y. Hot reload/restart does not reload it; stop and rebuild the app (fdb kill, then fdb launch).It also warns when the helper is older than the fdb CLI's major.minor:WARNING: fdb X with fdb_helper Y; update fdb_helper to ^X and rebuild.Stdout and exit codes are unchanged.fdb doctorreports the same problems as aDOCTOR_CHECK=fdb_helper_version STATUS=warn RUNNING=... RESOLVED=... FDB=... HINT=...line afterdevice. The line only appears when something is off, so a healthy run still prints 5 checks.fdb launchandfdb attachstore the project path in.fdb/project_path.txt. Older sessions fall back to the session directory's parent.- Needs the updated fdb_helper, which reports its version. Older helpers are flagged as "does not report its version (older than 1.13)".
Fixes #
- Fixed
fdb input --text/--key/--typeon a widget that is not a text field (e.g. a standalone labelText) typing into the first field under the screen-levelGestureDetectoraround it, which could be a different field. The text input is now resolved from the matched widget (itself, below it, or a custom editor above it); a field's own label or hint still resolves to that field. Otherwise the command fails, and a match holding several fields fails with the count. Needs the updated fdb_helper. - fdb no longer writes to
~/.pub-cache/bin. fdb 1.12.0 repointed its launchers there at the running SDK's snapshot wheneverdarton PATH differed from the SDK that activated fdb, so switching between two SDKs (e.g. an FVM-pinned project and a globaldart) rewrote them on every switch and theCan't load Kernel binaryline kept coming back. fdb now only reads thefdblauncher and, on a mismatch, prints one line after the kernel error:WARNING: fdb was activated with Dart X but 'dart' on PATH is Y; ... Fix: run 'dart pub global activate fdb' with the Dart you use.The command then runs normally.FDB_NO_BINSTUB_REPAIRno longer does anything. - Fixed
fdb tap,longpressanddouble-tapby--key/--text/--typereporting success on a disabled widget, for example a send button that the app enables only afterfdb inputupdates its state. The tap did nothing. fdb now never dispatches a selector tap to a disabled widget: it retries until the app enables it, up to--timeout, then exits 1 withERROR: <Type> is disabled. Disabled means a Material/Cupertino button withoutonPressed, aSwitch/Checkbox/SliderwithoutonChanged, aListTileor text field withenabled: false, or a custom button whose ownGestureDetector/InkWellhas no callbacks. When fdb can't tell, the widget counts as enabled. Needs the updated fdb_helper. - Fixed
fdb tap @Ntapping the wrong widget or a point outside the screen. It used to describe the screen again and tap entry N's stored coordinates, with no check that the widget there was the one the agent saw or that it was on screen. After ascroll-tothe refs had shifted and the tap hit a different button; an entry on an off-screenPageViewpage was "tapped" atX=-553. Now the ref names the widget itself (see stable refs above) andtap @Ntaps it through the same checks as--key/--text: a covered, scrolled-out or off-screen widget fails with exit 1 and nothing is tapped, and a disabled one waits up to--timeoutlike a selector tap. Needs the updated fdb_helper. fdb launch,attach,logsand the app-died log tail no longer fail with aFileSystemExceptionwhenlogs.txtcontains invalid UTF-8. Malformed bytes are replaced with U+FFFD.fdb logs --followalso decodes new output as UTF-8 instead of Latin-1.fdb syslogno longer dies withFormatException: Invalid UTF-8 bytewhen device logs contain bytes that aren't valid UTF-8 (seen with raw 0xFF in Android logcat). Output fromadb logcat,logandidevicesyslog, and fromflutter run,flutter devices,crash-report,mem nativeand attach's VM service discovery, is now decoded as UTF-8 with malformed bytes replaced by U+FFFD.- The log collector no longer outlives
fdb kill. It used to stay running after the app's VM service went away (for example after a relaunch) with its PID file already deleted, so nothing could find it. It now exits when the connection closes, only removes its PID file while that file still names it, and the controller stops it on shutdown.
1.12.0 #
Improvements #
fdb inputworks with any text input, not justTextField/EditableText. From the focused element (or the--text/--key/--type/--indexmatch) fdb_helper checks the element, then its descendants (EditableTextfirst, then anyStateimplementingTextInputClient), then its ancestors. This covers flutter_quill (QuillEditor/QuillRawEditorState) and customTextInputClient/DeltaTextInputClienteditors. Text is applied through the client (updateEditingValueorupdateEditingValueWithDeltas), so the widget's controller and listeners run; no keyboard needed. Content is replaced; rich-text editors keep their trailing document newline.- New
fdb input --action <name>sends an IME action viaTextInputClient.performAction, after the text or on its own (fdb input "QA test" --action send,fdb input --action done). PrintsIME_ACTION=<action> TARGET=<widgetType>. The widget decides what the action does:EditableTextcallsonSubmitted/onEditingComplete; flutter_quill callsQuillEditorConfig.onPerformActionif the app set it. Older fdb_helper versions report that the action was not performed. fdb inputerrors now name the widget and the reason, e.g.ElevatedButton is not a text input: no EditableText and no State implementing TextInputClient was found on it, below it, or above it.fdb describelists non-EditableTexttext inputs as interactive entries:@N QuillRawEditor(editable) "current text"(JSON:editable: true,inputClient: <StateType>).
Fixes #
Can't load Kernel binary: Invalid kernel binary format versionwhen fdb was activated with a different Dart SDK than thedarton PATH (e.g. FVM). fdb now repoints itsfdbandfdb-controllerlaunchers in~/.pub-cache/binto the snapshot for the running SDK once and prints aWARNING:. SetFDB_NO_BINSTUB_REPAIR=1to disable; fdb then prints the manual fix.fdb describeandfdb screenshotwarn on stderr when the app isn't in the foreground (WARNING: App is not in the foreground (lifecycle=paused). ..., or theinactivevariant). Stdout and exit codes are unchanged. When iOS has suspended the backgrounded app and its VM service stops answering,describenow reports that instead of the misleading "fdb_helper not detected". Needs the updated fdb_helper (newext.fdb.lifecycleextension,lifecycleStatein describe JSON).- Fixed
fdb tap --keyon a custom button (a widget that builds its ownGestureDetector, not a Material/Cupertino button) tapping the centre of an outerGestureDetector, such as a screen-level keyboard dismisser. It now taps the keyed widget and reports its type. - Fixed
fdb input --keyon a field scrolled out of view reportingINPUT=Column(orSemantics,Listener) and typing into the first field of that container. It now reports and types into the matched field.fdb tapon a partly visible widget taps the visible part; on a widget scrolled fully out of view it fails with an error asking tofdb scroll-toit first. - Fixed
fdb tap,longpress,double-tapandswipeby--key/--text/--typetapping roughly the screen centre when the matched widget was covered (a dialog, bottom sheet, opaque overlay, orIgnorePointer/AbsorbPointer/Offstage). They used to fall back to a large hittable ancestor such as theOverlay,Scaffoldor a screen-levelGestureDetector. They now tap only a point inside the matched widget that reaches it (for aTextinside a button, the button), and otherwise keep retrying until--timeout(a dialog that is still closing), then exit 1 without tapping:ERROR: ElevatedButton is not hittable: it is covered by ModalBarrier at 200.0,410.0. Dismiss what covers it or use --index/another selector. Needs the updated fdb_helper.
1.11.2 #
Fixes #
- Fixed
flutter build apk --profile(andflutter run --profile) failing for Android apps that depend onfdb_helperwithUnresolved reference 'FdbHelperNativeTapImpl'. Profile builds now compile the real native tap implementation, sofdb attach,tap,input, anddescribework against Android profile builds (#163).
1.11.1 #
Fixes #
- Fixed several
core/commandsverbs (crash-report,mem,mem native,screenshot,tap) and the controller'sVmServiceCommandrunner returning a delegatedFuturewithoutawaitinside atryblock, which let exceptions from the delegate escape the surrounding error handling instead of being translated into a sealed error result (orControllerResponse.appDiedfor the controller runner).
1.11.0 #
Improvements #
fdb_helpernow exportsFdbServiceExtensionsMixin, allowing fdb's VM service extensions to compose with other custom Flutter bindings such asDevicePreviewBindingMixin. ExistingFdbBinding.ensureInitialized()usage remains supported.
1.10.1 #
Fixes #
- Windows:
fdbno longer crashes onwhich(Windows has nowhichbinary) — tool lookup now dispatches towhereon Windows. Affectsmem,doctor,syslog,crash-report, andattach's VM URI auto-discovery. - Windows:
fdb launchandfdb attachno longer crash immediately — they no longer try to watchSIGTERM, which Dart cannot watch on Windows. - Windows: PID-liveness checks (previously
kill -0) now usetaskliston Windows. Fixesfdb launchfalsely reporting the app died seconds after starting, andfdb killsilently reporting success without actually killing the process.
1.10.0 #
New commands #
fdb swipe-path --points "x1,y1;x2,y2;..."dispatches an arbitrary multi-point path as a single continuous pointer stroke, for drawing canvases, signature pads, and handwriting/gesture recognizers thatswipe's straight-line model can't express.
Improvements #
fdb swipeandfdb swipe-pathnow accept--precisionto control the max pixel gap between synthesized move events (default8.0, matching priorswipebehavior).
1.9.0 #
New commands #
fdb attachnow auto-discovers the VM service URI from device logs on Android and iOS — no--debug-urlneeded. Android usesadb logcat; iOS Simulator usesxcrun simctllog; physical iOS usesidevicesyslogarchive lookback. Falls back to mDNS when discovery returns null.- Adding
fdb_helperto the app enables the[FDB_VM_URI]log marker, which fdb prefers over Flutter's own output for more reliable auto-discovery.
Improvements #
fdb skillnow prints a compact core (~60 lines) instead of the full 800-line reference. Full docs are split into 6 topic sub-documents loaded on demand:fdb skill launch,fdb skill interact,fdb skill data,fdb skill diagnostics,fdb skill memory,fdb skill simulator. Each sub-doc includes a best-practices section.
Fixes #
- Smoke tests replaced timing-based sleeps with deterministic app-state checks to fix intermittent failures on Android.
1.8.0 #
New commands #
fdb attachattaches fdb to an already-running debug/profile Flutter app, including apps started from Xcode or Android Studio. It supports--app-idfor disambiguation and--debug-urlfor iOS/macOS/manual discovery fallbacks.fdb heap dump --outputcaptures DevTools-loadable heap snapshots.fdb mem nativeruns platform-native memory tools for Android, iOS simulator, and macOS.
Improvements #
fdb longpress --atnow uses native long-press injection on supported platforms.- The fdb skill and README now include a memory leak investigation workflow.
Fixes #
fdb launch --flavornow resolves flavor-specific Android application ids and iOS/macOS bundle ids for.fdb/app_id.txt.
1.7.3 #
Fixes #
fdb launch --dart-defineand--dart-define-from-filenow preserve comma-containing values instead of splitting them during passthrough toflutter run(contributed by Rustam Gilyaev)fdb screenshoton macOS now uses the app PID from controller-backed launches, so screenshots work reliably after launch
1.7.2 #
1.7.1 #
Fixes #
fdb devicesnow honors project-local FVM Flutter SDKs instead of requiring a globalflutteronPATH
1.7.0 #
New commands #
fdb launch -i/fdb launch --interactive— starts an interactive REPL after launch for reload, restart, describe, tap, logs, and kill workflows without leaving the shell (contributed by Brett Sutton)
Improvements #
fdb launchnow starts a long-lived local controller process that owns theflutter run --machinesession. Follow-up commands talk to the controller over a local socket instead of independently reconnecting to the VM service on every invocation. (contributed by Brett Sutton)fdb grant-permissionnow accepts--deviceto pass a specific simulator UDID toxcrun simctl privacy, enabling pre-grant before the app is launchedfdb describenow includes visible TextField values inVISIBLE TEXT
Fixes #
fdb launchrun twice in the same project no longer orphans the previous controller process- Ctrl-C during
fdb launchnow terminates the controller instead of leaving it detached fdb killalways cleans up session files even when some processes fail to stop- Walk-up session resolution now correctly detects a live session when only
controller.pidis alive fdb input ""(clear a text field) no longer fails through the controller transport- Physical iOS no longer falsely reports
APP_DIEDwhen the controller is unavailable — device-side PIDs cannot be checked from the host
1.6.4 #
Fixes #
fdb_helperprofile builds now compile the real native tap implementation again on iOS and macOS, so internal/dev distributions (Firebase App Distribution, TestFlight internal) remain profilable byfdb native-tap. Only release builds compile the safe stub. Android profile already kept the real implementation via Flutter'smatchingFallbacks(debug → release).
1.6.3 #
Fixes #
fdb_helperrelease builds now compile a safe stub instead of the private-API native tap implementation, so iOS App Store binaries no longer ship the private UIKit/IOHID symbols. Debug builds keep the real implementation. Android release builds compile a stub variant via Gradle source sets and no longer depend on the debug-only Flutter embedding artifact. (Profile build behavior was incorrect in this release; see 1.6.4.)
1.6.2 #
Fixes #
fdb swipenow dispatches finer-grained synthetic pointer moves, so swiping aPageViewwhose pages contain scale-capable gesture handlers moves pages reliably instead of losing Flutter's gesture arena to the child scale recognizer.
1.6.1 #
Fixes #
fdb tap --textnow resolves to the enclosing interactive widget instead of the matchedTextleaf — agents that branched onTAPPED=<type>no longer getTextfor buttons whose label they tapped (closes #119)fdb tap --keyno longer reportsIgnorePointerfor buttons wrapped in route-levelIgnorePointer(ignoring: false)transitions; pass-through wrappers are now skipped during the ancestor walk (closes #118)
Improvements #
- The closed-list of interactive widgets recognised by
fdb tapandfdb describenow covers the full Cupertino family (CupertinoButton,CupertinoSwitch,CupertinoTextField,CupertinoSlider,CupertinoListTile,CupertinoExpansionTile, etc.) plus Material widgets that were previously missing (Chipfamily,MenuItemButton,SubmenuButton,SegmentedButton,ListTile,ExpansionTile,Tab,BackButton,CloseButton,RangeSlider,InkResponse,NavigationBar,BottomNavigationBar,NavigationRail,NavigationDestination,DropdownMenu,ToggleButtons)
1.6.0 #
New commands #
fdb simulator— full simulator control palette: appearance (light/dark), status bar overrides, location spoofing, push notification delivery, text size, and arbitrarydefaults writekey-value adjustmentsfdb grant-permission— grant, revoke, or reset runtime permissions on Android and iOS without leaving the fdb workflow
Fixes #
fdb launchnow correctly resolves the iOS/macOS bundle ID whenInfo.plistuses the$(PRODUCT_BUNDLE_IDENTIFIER)variable reference — previously fell through to the Android Gradle extractor and wrote the wrong bundle ID to.fdb/app_id.txtfdb describenow surfaces buttons insideListTileas separate interactive elements instead of merging them into the tile's tap target
1.5.1 #
Fixes #
fdb describeno longer leaks elements from underlying navigator routes — when navigating to a child screen, the handler previously walked route subtrees kept alive by the Navigator stack; the fix tracks the activeModalRouteboundary and prunes any subtree whereisCurrentisfalse
1.5.0 #
New commands #
fdb gc— force a full garbage collection across all isolates; prints heap before/after delta
Improvements #
fdb launchnow surfaces structuredLAUNCH_ERROR=<CATEGORY>tokens when flutter process exits before the VM service appears, withLAUNCH_ERROR_CAUSEandHINTfor known failure patterns (iOS bundle ID, code signing, Android ADB install, SDK toolchain, build errors)skills/using-fdb/SKILL.mdis now a lean install-once shim;fdb skillreads the full reference from the bundledlib/skill/SKILL.md
Fixes #
fdb tapon a widget that disappears during or after the tap now returns graceful success instead of an error
1.4.0 #
New commands #
fdb crash-report— fetches OS-level crash and OOM records from the system log (Android logcat, iOS Console, macOS unified log), filtered to the running appfdb ext list— enumerates all registered VM service extensions across isolatesfdb ext call <method>— invokes any VM service extension and prints the JSON resultfdb mem— shows heap totals (usage, external, capacity) per isolate with human-readable formattingfdb mem --json— same as above in machine-readable JSONfdb mem profile— captures an allocation profile snapshot to a filefdb mem diff— diffs two allocation profile snapshots and reports allocation changes
Improvements #
fdb launchsmoke readiness detection now usesfdb waitinstead of a manual poll loop, making it more reliable and readable
Fixes #
fdb describenow surfaces allGestureDetectorandInkWellwidgets at any nesting depth insideStack/Positioned; previously the walk stopped at the first interactive ancestor, silently dropping inner buttons- iOS simulator smoke tests stabilised
1.3.0 #
New commands #
fdb syslog— streams native system logs (iOS Console / Android logcat) for the running appfdb native-tap --at x,y— taps native OS UI (permission dialogs, system sheets) by injecting events at the OS level, bypassing Flutter entirely (adb shell input tapon Android, IndigoHID on iOS simulator)fdb tap --at x,y— taps by absolute coordinates via in-process native injection through fdb_helper, reaching platform views overlaid on the Flutter surface (WebView, UIAlertController, AlertDialog) without requiring OS-level access
Improvements #
fdb describenow surfaces off-screen children ofGridViewandListViewthat were previously hidden- App death is now detected and surfaces an
APP_DIEDerror immediately instead of hanging .fdb/state directory is now auto-located by walking up the directory tree, so fdb commands work from any subdirectory of the projectfdb statusreturnsRUNNING=truewhen a launch was interrupted but the app is still alive via VM URI fallbackfdb.app_pidis now stored separately fromfdb.pidfor accurate app liveness detection
Fixes #
- Session directory walk-up no longer escapes to a parent
.fdb/that has novm_uri.txtwhen the local PID is stale fdb statusVM URI fallback works correctly when launch is interrupted
1.2.1 #
Fixes #
fdb logsnow keeps recent VM-service log lines readable through unexpected app crashes by running the log collector as a real entrypoint with serialized flushes
1.2.0 #
New commands #
fdb doctor- pre-flight health checks for the app process, VM service,fdb_helper, platform tools, and stored device statefdb double-tap- double-tap widgets by selector or absolute coordinatesfdb scroll-to- scroll until a target widget becomes visible, including lazy listsfdb wait- wait for widget and route presence or absence without shell polling loops
Improvements #
fdb tapandfdb longpressnow support absolute coordinate targeting via--at x,y- Reload and restart completion now use VM lifecycle events for more reliable detection, including macOS reload handling
- Test automation gained a stricter verify pipeline plus more robust deep-link and double-tap smoke coverage
Fixes #
- Android test app now registers the
fdbtest://URL scheme so deep-link smoke tests exercise the real Android flow
1.1.7 #
New #
fdb screenshotnow supports all platforms: macOS (screencapture), Linux X11 (xdotool+import), physical iOS / Windows / Linux Wayland (viafdb_helperVM extension), and web (Chrome DevTools Protocol)fdb_helper: newext.fdb.screenshotVM extension — renders the Flutter surface to PNG and returns base64; used as fallback on platforms with no native capture CLI- Screenshots are automatically downscaled so the longest side fits within 1200px (preserving aspect ratio), using the pure-Dart
imagepackage; pass--fullto get native resolution
Fixes #
- Screenshot:
fdb launchnow writes.fdb/platform.txtso screenshot dispatches to the correct backend without probing live tools at capture time - Screenshot: Android and iOS simulator now targeted by explicit device ID (no more
bootedheuristic that breaks with multiple simulators) devices.dart: safe cast foremulatorfield (as bool? ?? false) to avoid crash on unexpected flutter devices outputextractDevicesJsondeduplicated intoprocess_utils.dart(was copied in bothlaunch.dartanddevices.dart)- Fix CI release:
fdb_helper/CHANGELOG.mdmissing 1.1.6 entry caused GitHub release to not be created despite pub.dev publish succeeding
1.1.6 #
Fixes #
SKILL.mdstate files section corrected: paths are<project>/.fdb/(not/tmp/) since 1.1.0SKILL.mdscreenshot default path corrected to<project>/.fdb/screenshot.pngdoc/README.agents.mdscreenshot default path corrected to<project>/.fdb/screenshot.png
Improvements #
- README: updated Flutter MCP server description to accurately reflect its current capabilities (runtime introspection, not just static analysis)
- README: comparison table "Device interaction" row now enumerates fdb's full interactive command set and correctly characterises the MCP server as read-only
- README:
fdb describecommand annotated with(requires fdb_helper)in the commands table
1.1.5 #
Fixes #
- Fix CI publish: fdb 1.1.4 was published but fdb_helper was not due to missing CHANGELOG entry
1.1.4 #
Improvements #
- Renamed skill from
interacting-with-flutter-appstousing-fdbfor better discoverability on skills.sh
1.1.3 #
Improvements #
fdb_helperis now published to pub.dev — add it asfdb_helper: ^1.1.3instead of a git path reference
1.1.2 #
New commands #
fdb shared-prefs get|get-all|set|remove|clear— read/write/clear SharedPreferences from the CLI via a VM service extension in fdb_helper
Fixes #
fdb deeplinknow uses the session device ID to detect platform instead of probing all connected devices — fixes misrouting to Android when both Android and iOS are connected but the session is on iOS
Improvements #
- Smoke test extended with
test:cleanandtest:shared-prefstasks covering all sub-commands
1.1.1 #
Improvements #
fdb_helperinstall instructions now reference pub.dev (fdb_helper: ^X.Y.Z) instead of a git path reference- Releasing skill updated to track all 9 version-bearing files
1.1.0 #
Fixes #
- Fix
developer.log()output not appearing infdb logs—flutter runnever forwardsdeveloper.log()to stdout; a background log collector now subscribes to the VM serviceLoggingstream and appends events directly to the log file
Improvements #
- Session state moved from
/tmp/fdb_*.txtto<project>/.fdb/— multiple projects can run simultaneously without interfering with each other .fdb/is automatically added to the project's.gitignoreon first launch- FVM support:
launchauto-detects.fvm/flutter_sdk/bin/flutter; override with--flutter-sdk <path> --projectflag onlaunchis now optional — defaults to CWD (agents running from the project directory need not pass it)- Log collector self-cleans on SIGTERM, SIGINT, and when flutter run exits
1.0.1 #
Fixes #
- Fix dartdoc angle bracket warnings in
describe.dartandvm_service.dart - Fix deeplink smoke test — register
fdbtest://URL scheme in test app Info.plist - Fix back smoke test — restart app to reset UI state before navigation test
Improvements #
- Add
example/example.mdfor pub.dev Example tab - Replace mermaid code block with pre-rendered SVG diagram (renders on pub.dev)
- Add
dart pub global activate fdbinstall option to README - Add release skill and CI publish workflow
1.0.0 #
New commands #
fdb back— navigate back via Navigator.maybePop(), handles dialogs and root detectionfdb longpress— long-press widgets, reuses tap infrastructure with configurable durationfdb swipe— swipe gestures for PageView/Dismissible with widget targeting and smart defaultsfdb describe— compact screen snapshot with interactive element refs (@1, @2...) for agent navigationfdb devices— list connected devicesfdb deeplink— open deep link URLs on devicefdb skill— print SKILL.md for AI agent consumption
Describe command #
- Shows only hittable, topmost-layer widgets (filters obscured/background route elements)
- Gesture info on GestureDetector/InkWell:
(tap),(tap,horizontalDrag),(tap,longPress) - Extracts text from all children, tooltips, and icon semantic labels
- Filters framework widgets and Unicode PUA icon codepoints
- Ref-based tapping:
fdb tap @3taps the 3rd interactive element from last describe - Shows deepest route name and Scaffold title
Fixes #
- Error propagation: specific error messages instead of "Server error"
--texttap: walks to hittable ancestor when Text widget itself isn't in hit-test path--indexordering: user widgets before framework widgets (Overlay, IndexedStack, _Theater)--keytap: ancestor walk for KeyMatcher/TypeMatcher, not just TextMatcher--help/-h: prints to stdout with exit 0, no "ERROR:" prefix- Swipe velocity: process-relative Stopwatch timestamps for VelocityTracker fling detection
- Screenshot: defaults to 1x logical resolution (~180KB vs ~1MB),
--fullfor native - Screenshot: supports
--output=pathequals syntax, fixes Android shell escaping - Skill command: resolves SKILL.md via package URI for global installs
0.1.0 #
- Initial release
- CLI commands: launch, status, reload, restart, kill, logs, tree, screenshot, select, selected, tap, input, scroll
- fdb_helper package for Flutter app integration