[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-maui-ai-debugging":3,"mdc--715epd-key":46,"related-repo-dotnet-maui-ai-debugging":9404,"related-org-dotnet-maui-ai-debugging":9505},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":41,"sourceUrl":44,"mdContent":45},"maui-ai-debugging","debug .NET MAUI application issues","Legacy DevFlow debug skill. USE FOR: `maui-ai-debugging`, `maui devflow`, screenshots, visual tree, Blazor CDP, simulator\u002Femulator debugging. DO NOT USE FOR: setup, desktop automation, AppleScript, host `xdotool`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"MAUI","maui","tag",{"name":17,"slug":18,"type":15},".NET","net",{"name":20,"slug":21,"type":15},"Mobile","mobile",{"name":23,"slug":24,"type":15},"Debugging","debugging",190,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmaui-labs","2026-07-12T08:22:52.634889",null,21,[31,32,33,8,34,35,14,36,37,21,38,39,40],"ai","android","desktop","ios","maccatalyst","mcp","microsoft","multi-platform","user-interface","winui",{"repoUrl":26,"stars":25,"forks":29,"topics":42,"description":43},[31,32,33,8,34,35,14,36,37,21,38,39,40],"Experimental and pre-release tools for .NET MAUI","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmaui-labs\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-maui\u002Fskills\u002Fmaui-ai-debugging","---\nname: maui-ai-debugging\ndescription: >-\n  Legacy DevFlow debug skill. USE FOR: `maui-ai-debugging`, `maui devflow`, screenshots, visual tree, Blazor CDP, simulator\u002Femulator debugging. DO NOT USE FOR: setup, desktop automation, AppleScript, host `xdotool`.\n---\n\n# MAUI AI Debugging\n\nCompatibility note: this legacy skill name is retained for older clients. The canonical\nreplacement is `maui-devflow-debug`, installed through `maui devflow init` \u002F\n`maui devflow skills update`.\n\nBuild, deploy, inspect, and debug .NET MAUI apps from the terminal. This skill enables a complete\nfeedback loop: **build → deploy → inspect → fix → rebuild**.\n\n## Prerequisites\n\n```bash\ndotnet tool install --global Microsoft.Maui.Cli --prerelease || dotnet tool update --global Microsoft.Maui.Cli --prerelease\ndotnet tool install --global androidsdk.tool    # Android only\ndotnet tool install --global appledev.tools     # iOS\u002FMac only\n```\n\nKeep DevFlow skills up to date with `maui devflow skills update`. The hidden\n`maui devflow update-skill` compatibility command runs the same bundled updater\nand may remove this legacy skill after installing current replacements.\n\n## Optional Session Feedback Nudge\n\nIf this legacy workflow involved repeated DevFlow retries, unclear workarounds,\nor a long debugging session, ask whether the user wants to run\n`maui-devflow-session-review` to summarize friction for MAUI DevFlow product\nfeedback. Do not run it automatically.\n\n## Integrating MauiDevFlow into a MAUI App\n\nFor complete setup instructions, see [references\u002Fsetup.md](references\u002Fsetup.md).\n\n**Quick summary:**\n1. Add NuGet packages (`Microsoft.Maui.DevFlow.Agent`, and `Microsoft.Maui.DevFlow.Blazor` for Blazor Hybrid)\n   - For **Linux\u002FGTK apps** (detected via `grep -i 'GirCore\\|Maui\\.Gtk' *.csproj`), use `Agent.Gtk` and `Blazor.Gtk` instead\n   - For **macOS (AppKit) apps** (detected via `grep -i 'Platform\\.Maui\\.MacOS' *.csproj`), the standard `Agent` and `Blazor` packages include macOS support\n2. Register in `MauiProgram.cs` inside `#if DEBUG`\n3. For Blazor Hybrid: chobitsu.js is auto-injected (no manual script tag needed)\n4. For Mac Catalyst: ensure `network.server` entitlement\n5. For Android: run `adb reverse` for broker + agent ports\n6. For Linux: no special network setup needed (direct localhost)\n7. For macOS (AppKit): separate app head project, uses `open App.app` to launch. See [references\u002Fmacos.md](references\u002Fmacos.md)\n\n## Core Workflow\n\n### 0. Verify DevFlow Availability\n\nBefore building or launching anything, determine if DevFlow is available for the current project.\n\n**Check integration (project files — the source of truth):**\n```bash\n# Check if any csproj in the project has DevFlow packages\ngrep -rl \"MauiDevFlow\\|Maui\\.DevFlow\" --include=\"*.csproj\" .\n```\n\nIf grep returns results, DevFlow IS integrated — even if `maui devflow list` shows nothing.\n\n**Check runtime connection:**\n```bash\nmaui devflow list                          # shows connected agents\nmaui devflow broker status                 # shows broker health\nmaui devflow diagnose                      # full end-to-end health check (recommended)\n```\n\n**Decision tree — what to do based on results:**\n\n| Project has DevFlow packages? | Agent in `list`? | Action |\n|-------------------------------|------------------|--------|\n| ✅ Yes | ✅ Yes | Ready — proceed to inspection\u002Finteraction |\n| ✅ Yes | ❌ No | App not running in Debug, or broker issue. Launch app, then `maui devflow wait` |\n| ❌ No | — | Need to integrate DevFlow (see \"Integrating MauiDevFlow into a MAUI App\") |\n\n**⚠️ CRITICAL:** `maui devflow list` shows RUNTIME state (connected agents), NOT project integration.\nAn empty list does NOT mean \"DevFlow is not installed.\" Always check project files first.\n\n**After launching the app (via `dotnet build -t:Run` or through Aspire):**\n```bash\nmaui devflow wait                          # blocks until agent connects (default 120s)\nmaui devflow wait --project path\u002Fto\u002FApp.csproj  # filter to specific project\n```\nALWAYS run `wait` after launching. Never assume the agent is connected — verify it.\n\n### 1. Ensure a Device\u002FSimulator\u002FEmulator is Running\n\n**⚠️ Multi-project conflict avoidance:** When multiple projects may run simultaneously\n(common with AI agents), each project should use its own dedicated simulator\u002Femulator to\nprevent apps from replacing each other. Check what's already in use first:\n\n```bash\nmaui devflow list     # check if any agents are already connected (runtime state only — see Step 0 for integration check)\n```\n\nIf another iOS or Android agent is already registered, **create a new simulator\u002Femulator**\nfor your project instead of reusing the one that's already booted.\n\n**iOS Simulator:**\n```bash\nxcrun simctl list devices booted                              # check booted sims\n\n# Create a project-dedicated simulator to avoid conflicts\nxcrun simctl create \"MyApp-iPhone17Pro\" \"iPhone 17 Pro\" \"iOS 26.2\"\nxcrun simctl boot \u003CUDID>                                      # boot the new sim\n```\n\n**Android Emulator:**\n```bash\nandroid avd list                                              # list AVDs\n\n# Create a project-dedicated emulator to avoid conflicts\nandroid avd create --name \"MyApp-Pixel8\" \\\n  --sdk \"system-images;android-35;google_apis;arm64-v8a\" --device pixel_8\nandroid avd start --name \"MyApp-Pixel8\"\n```\n\n**Mac Catalyst \u002F macOS (AppKit) \u002F Linux\u002FGTK:** No device setup needed — runs as desktop app.\nMultiple desktop apps can run simultaneously without conflicts.\n\n### 2. Detect the TFM\n\n**IMPORTANT:** Before building, detect the correct Target Framework Moniker from the project.\nDo NOT assume `net10.0` — many projects use `net9.0`, `net8.0`, etc.\n\n```bash\ngrep -i 'TargetFrameworks' *.csproj Directory.Build.props 2>\u002Fdev\u002Fnull\n```\n\nUse the detected version (e.g. `net9.0`) in all build commands. The examples use `$TFM`.\n\n### 3. Build, Deploy, and Connect\n\nFollow these steps for every launch and rebuild.\n\n**Step 1: Kill any previous instance** (skip on first launch).\nA stale app's agent stays registered with the broker, causing `maui devflow wait` to return\nthe old port instantly instead of waiting for the new build.\n\n```bash\n# Stop the async shell from the previous launch, then confirm:\nmaui devflow list                 # should show no agents (or only unrelated ones)\n```\n\n**Step 2: Launch in an async shell.**\n\n```bash\n# iOS Simulator\ndotnet build -f $TFM-ios -t:Run -p:_DeviceName=:v2:udid=\u003CUDID>\n\n# Android Emulator\ndotnet build -f $TFM-android -t:Run\n\n# Mac Catalyst\ndotnet build -f $TFM-maccatalyst -t:Run\n\n# macOS AppKit — build exits after compiling; launch separately\ndotnet build -f $TFM-macos \u003Cpath-to-macos-project>\nopen path\u002Fto\u002Fbin\u002FDebug\u002F$TFM-macos\u002Fosx-arm64\u002FAppName.app\n\n# Linux\u002FGTK\ndotnet run --project \u003Cpath-to-gtk-project>\n```\n\n**⚠️ Process lifecycle rules:**\n- `dotnet build -t:Run` (iOS, Android, Mac Catalyst) and `dotnet run` (Linux\u002FGTK) **block\n  for the lifetime of the app**. Killing or stopping the shell **kills the app**. Use\n  `mode: \"async\"` with `initial_wait: 120` and do NOT stop the shell until you are done.\n- **macOS (AppKit)** is the exception: `dotnet build` exits after compiling, and `open`\n  launches the app independently — the app survives shell termination.\n\n**Step 3: Wait for the agent** — never use `sleep`.\n\n```bash\nmaui devflow wait                                # blocks until agent registers (default 120s)\nmaui devflow wait --project path\u002Fto\u002FApp.csproj   # filter to specific project\n```\n\n`maui devflow wait` prints the assigned port as soon as the agent connects. Exit code 1\nmeans timeout. If `wait` times out, run `maui devflow diagnose` to identify the issue.\nCheck async shell output for build errors.\n\n**Android only** — set up port forwarding after the agent connects:\n```bash\nadb reverse tcp:19223 tcp:19223   # Broker (lets agent in emulator reach host broker)\nadb forward tcp:\u003Cport> tcp:\u003Cport> # Agent (lets CLI reach agent in emulator)\n```\n\n**To rebuild:** repeat from Step 1. See [references\u002Ftroubleshooting.md](references\u002Ftroubleshooting.md)\nif the build fails.\n\n### 4. Inspect and Interact\n\n**Typical inspection flow:**\n1. `maui devflow ui tree --depth 15 --fields \"id,type,text,automationId\"` — tree with key fields only (depth 15 reaches most controls)\n2. `maui devflow ui tree --window 1` — filter to a specific window (0-based index)\n3. `maui devflow ui query --automationId \"MyButton\"` — find specific elements\n4. `maui devflow ui query --type Entry --fields \"id,text,automationId\"` — all Entry fields with specific fields\n5. `maui devflow ui element \u003Cid>` — get full details (type, bounds, visibility, children)\n6. `maui devflow ui property \u003Cid> Text` — read any property by name\n7. `maui devflow ui screenshot --output screen.png` — visual verification (auto-scaled to 1x on HiDPI)\n8. `maui devflow ui screenshot --id \u003CelementId> --output el.png` — element-only screenshot\n9. `maui devflow ui screenshot --selector \"Button\" --output btn.png` — screenshot by CSS selector\n\n**Property inspection** is more reliable than screenshots for verifying exact runtime values:\n```bash\nmaui devflow ui property \u003Cid> BackgroundColor    # verify dark mode colors\nmaui devflow ui property \u003Cid> IsVisible          # check element visibility\n```\n\n**Live editing (no rebuild needed):**\n```bash\nmaui devflow ui set-property \u003Cid> TextColor \"Tomato\"\nmaui devflow ui set-property \u003Cid> FontSize \"24\"\n```\nSupports: string, bool, int, double, Color (named\u002Fhex), Thickness, enums. Changes persist\nuntil the app restarts — safe for experimentation.\n\n**Typical interaction flow:**\n1. `maui devflow ui fill --automationId \"MyEntry\" \"text\"` — type into Entry\u002FEditor fields (no query needed)\n2. `maui devflow ui tap --automationId \"MyButton\"` — tap buttons, checkboxes, list items\n3. `maui devflow ui clear --automationId \"MyEntry\"` — clear text fields\n4. Or use element IDs from tree\u002Fquery: `maui devflow ui tap \u003CelementId>`\n5. Take screenshot to verify result, or use `--and-screenshot` on the action\n\n**Blazor WebView (if applicable):**\n1. `maui devflow webview snapshot` — DOM tree as accessible text (best for AI)\n2. `maui devflow webview Input fill \"css-selector\" \"text\"` — fill inputs\n3. `maui devflow webview Input dispatchClickEvent \"css-selector\"` — click elements\n4. `maui devflow webview Runtime evaluate \"js-expression\"` — run JS\n\n**Multiple BlazorWebViews:** If the app has more than one `BlazorWebView`, each is\nregistered independently with its `AutomationId`. Use `webview webviews` to list them,\nthen target a specific one with `--webview` (or `-w`):\n\n```bash\nmaui devflow webview webviews                                  # list all WebViews\nmaui devflow webview -w BlazorLeft snapshot                    # snapshot of a specific WebView\nmaui devflow webview -w 1 Runtime evaluate \"document.title\"    # target by index\n```\n\nWithout `--webview`, commands target the first (index 0) WebView.\n\n**Live CSS\u002FDOM editing in Blazor (no rebuild needed):**\n```bash\nmaui devflow webview Runtime evaluate \"document.querySelector('h1').style.color = 'tomato'\"\nmaui devflow webview Runtime evaluate \"document.documentElement.style.setProperty('--bg-color', '#1a1a2e')\"\n```\n\n### 5. Reading Application Logs\n\nMauiDevFlow automatically captures all `ILogger` output and WebView `console.*` calls\nto rotating log files, retrievable remotely:\n\n```bash\nmaui devflow ui logs                   # fetch 100 most recent log entries\nmaui devflow ui logs --limit 50        # fetch 50 entries\nmaui devflow ui logs --source webview  # only WebView\u002FBlazor console logs\nmaui devflow ui logs --source native   # only native ILogger logs\nmaui devflow ui logs --follow          # stream logs in real-time (Ctrl+C to stop)\nmaui devflow ui logs -f --source native  # stream only native logs\nmaui devflow ui logs -f --json         # stream as JSONL (machine-readable)\n```\n\n**Debugging workflow:** Reproduce the issue → `maui devflow ui logs --limit 20` → check for\nerrors. Add temporary `ILogger` calls for more detail, rebuild, reproduce, and fetch logs again.\n\n### 6. Screen Recording\n\nCapture video of the app while performing interactions. Recording is host-side (not in-app)\nusing platform-native tools.\n\n```bash\n# Start recording (default 30s timeout)\nmaui devflow recording start --output demo.mp4\n\n# Interact with the app\nmaui devflow ui tap \u003CbuttonId>\nmaui devflow ui navigate \"\u002F\u002Fblazor\"\nmaui devflow ui fill \u003CentryId> \"Hello World\"\n\n# Stop and save\nmaui devflow recording stop\n```\n\n**Platform tools used automatically by MauiDevFlow's recording backend** (implementation detail —\ndo not invoke these directly unless the user explicitly asked for host-level recording):\n- **Android:** `adb screenrecord` (max 180s, capped with warning)\n- **iOS Simulator:** `xcrun simctl io recordVideo`\n- **Mac Catalyst \u002F macOS (AppKit):** `screencapture -v` (targets app window when possible)\n- **Windows\u002FLinux:** `ffmpeg` (must be on PATH)\n\n**Options:** `--timeout \u003Cseconds>` (default 30), `--output \u003Cpath>` (default `recording_\u003Ctimestamp>.mp4`).\nOnly one recording at a time — stop before starting a new one.\n\n### 7. Network Request Monitoring\n\nMonitor HTTP requests made by the app in real-time. MauiDevFlow automatically intercepts\nall `IHttpClientFactory`-based HTTP traffic via a `DelegatingHandler` — no app code changes\nneeded beyond the standard `AddMauiDevFlowAgent()` setup.\n\n```bash\n# Live monitor — streams requests as they happen (Ctrl+C to stop)\nmaui devflow network\n\n# JSONL streaming — machine-readable, one JSON object per line\nmaui devflow network --json\n\n# One-shot: list recent captured requests\nmaui devflow network list\n\n# Filter by method or host\nmaui devflow network list --method POST\nmaui devflow network list --host api.example.com\n\n# Full request\u002Fresponse details (headers + body)\nmaui devflow network detail \u003CrequestId>\n\n# Clear captured requests\nmaui devflow network clear\n```\n\n**How it works:**\n- A `DelegatingHandler` wraps the platform's HTTP handler (AndroidMessageHandler,\n  NSUrlSessionHandler, etc.), capturing request\u002Fresponse metadata, headers, and bodies\n- Auto-injected via `ConfigureHttpClientDefaults` — works for all `IHttpClientFactory` clients\n- For `new HttpClient()` outside DI, use `DevFlowHttp.CreateClient()` helper\n- Bodies up to 256KB are captured (configurable via `AgentOptions.MaxNetworkBodySize`)\n- A ring buffer (default 500 entries) stores recent requests in-memory\n\n**JSONL output** is ideal for AI parsing — pipe to `jq` or process programmatically:\n```bash\nmaui devflow network --json | jq 'select(.statusCode >= 400)'\n```\n\n**WebSocket streaming:** The live monitor uses WebSocket (`\u002Fws\u002Fnetwork`) for real-time push.\nConnecting clients receive a replay of buffered history, then live entries as they arrive.\n\n### 8. App Storage (Preferences & Secure Storage)\n\nRead, write, and delete app preferences and secure storage entries remotely. Useful for\ndebugging state, resetting app configuration, or injecting test values.\n\n```bash\n# Preferences (typed key-value store)\nmaui devflow preferences list                       # list all known keys\nmaui devflow preferences get theme_mode             # get a string value\nmaui devflow preferences get counter --type int     # get a typed value\nmaui devflow preferences set api_url \"https:\u002F\u002Fdev.example.com\"\nmaui devflow preferences set dark_mode true --type bool\nmaui devflow preferences delete temp_key\nmaui devflow preferences clear                      # clear all\n\n# Shared preferences containers\nmaui devflow preferences list --sharedName settings\nmaui devflow preferences set key val --sharedName settings\n\n# Secure Storage (encrypted, string values only)\nmaui devflow secure-storage get auth_token\nmaui devflow secure-storage set auth_token \"eyJhbGc...\"\nmaui devflow secure-storage delete auth_token\nmaui devflow secure-storage clear\n```\n\n**Note:** Preference key listing uses an internal registry (keys set via the agent are tracked).\nKeys set directly in app code won't appear in `list` unless also set via the agent.\n\n### 9. Platform Info & Device Features\n\nQuery read-only device and app state. These are one-shot snapshot reads.\n\n```bash\nmaui devflow platform app-info         # app name, version, build, theme\nmaui devflow platform device-info      # manufacturer, model, OS, idiom\nmaui devflow platform display          # screen density, size, orientation\nmaui devflow platform battery          # charge level, state, power source\nmaui devflow platform connectivity     # WiFi\u002FCellular\u002FEthernet, network access\nmaui devflow platform version-tracking # version history, first launch detection\nmaui devflow platform permissions      # check all common permission statuses\nmaui devflow platform permissions camera  # check a specific permission\nmaui devflow platform geolocation      # current GPS coordinates\nmaui devflow platform geolocation --accuracy High --timeout 15\n```\n\n### 10. Device Sensors\n\nStart, stop, and stream real-time sensor data. Sensors auto-start when streaming.\n\n```bash\nmaui devflow sensors list                    # list sensors + status\nmaui devflow sensors start accelerometer     # start a sensor\nmaui devflow sensors stop accelerometer\n\n# Stream readings to stdout (JSONL)\nmaui devflow sensors stream accelerometer          # Ctrl+C to stop\nmaui devflow sensors stream gyroscope --speed Game  # higher frequency\nmaui devflow sensors stream compass --duration 10  # stop after 10 seconds\n```\n\nAvailable sensors: `accelerometer`, `barometer`, `compass`, `gyroscope`, `magnetometer`, `orientation`.\nSpeed options: `UI` (default), `Game`, `Fastest`, `Default`.\n\n**WebSocket streaming:** Sensor data uses WebSocket (`\u002Fws\u002Fsensors?sensor=\u003Cname>`) for\nreal-time push. Each reading is a JSON object with `sensor`, `timestamp`, and `data` fields.\n\n## Command Reference\n\n### maui devflow ui (Native Agent)\n\nGlobal options (work on any subcommand):\n- `--agent-host` (default localhost), `--agent-port` (auto-discovered via broker), `--platform`\n- `--json` — force JSON output. Auto-enabled when stdout is piped\u002Fredirected (TTY auto-detection).\n- `--no-json` — force human-readable output even when piped.\n- Env var: `MAUIDEVFLOW_OUTPUT=json` for persistent JSON mode.\n\n**Implicit element resolution:** Commands that take an `\u003CelementId>` (tap, fill, clear, focus)\nalso accept `--automationId`, `--type`, `--text`, `--index` to resolve the element in a single\ncall. This eliminates the query→act round-trip. The `\u003CelementId>` argument is optional when\nresolution options are provided.\n\n**Post-action flags:** tap, fill, clear accept `--and-screenshot [path]`, `--and-tree`,\n`--and-tree-depth N` to return verification data alongside the action result.\n\n| Command | Description |\n|---------|-------------|\n| `ui status [--window W]` | Agent connection status, platform, app name, window count |\n| `ui tree [--depth N] [--window W] [--fields F] [--format compact]` | Visual tree. `--fields \"id,type,text\"` projects specific fields. `--format compact` returns only id, type, text, automationId, bounds |\n| `ui query [--type T] [--automationId A] [--text T] [--selector S] [--fields F] [--format compact] [--wait-until exists\\|gone] [--timeout N]` | Find elements. `--wait-until` polls until condition met (default 30s timeout). `--fields` and `--format` same as tree |\n| `ui hittest \u003Cx> \u003Cy> [--window W]` | Find elements at a point (deepest first). Returns IDs, types, bounds |\n| `ui tap [elementId] [--automationId A] [--type T] [--text T] [--index N] [--and-screenshot [path]] [--and-tree] [--and-tree-depth N]` | Tap element by ID or implicit resolution |\n| `ui fill [elementId] \u003Ctext> [--automationId A] [--type T] [--text T] [--index N] [--and-screenshot [path]] [--and-tree]` | Fill text into Entry\u002FEditor. elementId optional when using resolution options |\n| `ui clear [elementId] [--automationId A] [--type T] [--text T] [--index N] [--and-screenshot [path]] [--and-tree]` | Clear text. elementId optional when using resolution options |\n| `MAUI focus [elementId] [--automationId A] [--type T] [--text T] [--index N]` | Set focus. elementId optional when using resolution options |\n| `MAUI assert [--id ID] [--automationId A] \u003Cproperty> \u003Cexpected>` | Assert element property value. Exit 0 if match, 1 if mismatch. Ideal for verification without screenshots |\n| `MAUI screenshot [--output path.png] [--window W] [--id ID] [--selector SEL] [--overwrite] [--max-width N] [--scale native]` | PNG screenshot. Auto-scales to 1x logical resolution on HiDPI displays (2x, 3x). Use `--scale native` for full resolution. `--max-width N` overrides auto-scaling with explicit width. `--overwrite` replaces existing file |\n| `MAUI property \u003CelementId> \u003Cprop>` | Read property (Text, IsVisible, FontSize, etc.) |\n| `MAUI set-property \u003CelementId> \u003Cprop> \u003Cvalue>` | Set property (live editing — colors, text, sizes, etc.) |\n| `MAUI element \u003CelementId>` | Full element JSON (type, bounds, children, etc.) |\n| `MAUI navigate \u003Croute>` | Shell navigation (e.g. `\u002F\u002Fnative`, `\u002F\u002Fblazor`) |\n| `MAUI scroll [--element id] [--dx N] [--dy N] [--item-index N] [--group-index N] [--position P] [--window W]` | Scroll by delta, item index, or scroll element into view. `--item-index` scrolls to a specific item in CollectionView\u002FListView (works even for virtualized off-screen items). `--position`: MakeVisible (default), Start, Center, End. Delta scroll (`--dy -500`) uses native platform scroll for CollectionView |\n| `MAUI resize \u003Cwidth> \u003Cheight> [--window W]` | Resize app window. Window is 0-based index; default first window |\n| `MAUI logs [--limit N] [--skip N] [--source S] [--follow]` | Fetch or stream application logs. `--follow` \u002F `-f` streams in real-time (Ctrl+C to stop). Source: native, webview, or omit for all |\n| `MAUI recording start [--output path] [--timeout 30]` | Start screen recording. Default timeout 30s |\n| `MAUI recording stop` | Stop active recording and save the video file |\n| `MAUI recording status` | Check if a recording is currently in progress |\n| `MAUI network` | Live network monitor — streams HTTP requests in real-time (Ctrl+C to stop) |\n| `MAUI network list [--host H] [--method M]` | One-shot: dump recent captured HTTP requests |\n| `MAUI network detail \u003CrequestId>` | Full request\u002Fresponse details: headers, body, timing |\n| `MAUI network clear` | Clear the captured request buffer |\n| `MAUI preferences list [--sharedName N]` | List all known preference keys and values |\n| `MAUI preferences get \u003Ckey> [--type T] [--sharedName N]` | Get a preference value. Types: string, int, bool, double, float, long, datetime |\n| `MAUI preferences set \u003Ckey> \u003Cvalue> [--type T] [--sharedName N]` | Set a preference value |\n| `MAUI preferences delete \u003Ckey> [--sharedName N]` | Remove a preference |\n| `MAUI preferences clear [--sharedName N]` | Clear all preferences |\n| `MAUI secure-storage get \u003Ckey>` | Get a secure storage value |\n| `MAUI secure-storage set \u003Ckey> \u003Cvalue>` | Set a secure storage value |\n| `MAUI secure-storage delete \u003Ckey>` | Remove a secure storage entry |\n| `MAUI secure-storage clear` | Clear all secure storage entries |\n| `MAUI platform app-info` | App name, version, build, package, theme |\n| `MAUI platform device-info` | Device manufacturer, model, OS, idiom |\n| `MAUI platform display` | Screen density, size, orientation, refresh rate |\n| `MAUI platform battery` | Battery level, state, power source |\n| `MAUI platform connectivity` | Network access and connection profiles |\n| `MAUI platform version-tracking` | Current\u002Fprevious\u002Ffirst version, build history, isFirstLaunch |\n| `MAUI platform permissions [name]` | Check permission status. Omit name to check all common permissions |\n| `MAUI platform geolocation [--accuracy A] [--timeout N]` | Get current GPS coordinates. Accuracy: Lowest, Low, Medium (default), High, Best |\n| `MAUI sensors list` | List available sensors and their current state (started\u002Fstopped) |\n| `MAUI sensors start \u003Csensor> [--speed S]` | Start a sensor. Sensors: accelerometer, barometer, compass, gyroscope, magnetometer, orientation. Speed: UI (default), Game, Fastest, Default |\n| `MAUI sensors stop \u003Csensor>` | Stop a sensor |\n| `MAUI sensors stream \u003Csensor> [--speed S] [--duration N]` | Stream sensor readings via WebSocket. Duration 0 = indefinite (Ctrl+C to stop) |\n| `commands [--json]` | List all available commands with descriptions. `--json` returns machine-readable schema with command names, descriptions, and whether they mutate state |\n\nElement IDs come from `MAUI tree` or `MAUI query`. AutomationId-based elements use their\nAutomationId directly. Others use generated hex IDs. When multiple elements share the same\nAutomationId, suffixes are appended: `TodoCheckBox`, `TodoCheckBox_1`, `TodoCheckBox_2`, etc.\n\n**Element ID lifecycle:** IDs are ephemeral — they're regenerated on each tree walk. After\nnavigation, page changes, or significant UI updates, re-query to get fresh IDs. AutomationIds\nare stable across rebuilds (they come from XAML), so prefer `--automationId` for scripted flows.\n\n### maui devflow webview (Blazor WebView CDP)\n\nGlobal options: `--agent-host` (default localhost), `--agent-port` (auto-discovered via broker).\nCDP commands use the same agent port — all communication goes through a single port.\nUse `--webview \u003Cid>` (or `-w \u003Cid>`) on any CDP command to target a specific WebView\nby index, AutomationId, or element ID. Default: first WebView.\n\n| Command | Description |\n|---------|-------------|\n| `cdp status` | CDP connection status and WebView count |\n| `cdp webviews [--json]` | List available CDP WebViews (index, AutomationId, ready status) |\n| `cdp snapshot` | Accessible DOM text (best for AI agents) |\n| `cdp source` | Get full page HTML source |\n| `cdp Browser getVersion` | Browser\u002FWebView version info |\n| `cdp Runtime evaluate \u003Cexpr>` | Evaluate JavaScript |\n| `cdp DOM getDocument` | Full DOM document |\n| `cdp DOM querySelector \u003Csel>` | Find first matching element |\n| `cdp DOM querySelectorAll \u003Csel>` | Find all matching elements |\n| `cdp DOM getOuterHTML \u003Csel>` | Get outer HTML of element |\n| `cdp Page navigate \u003Curl>` | Navigate to URL |\n| `cdp Page reload` | Reload page |\n| `cdp Page captureScreenshot` | Screenshot as base64 |\n| `cdp Input dispatchClickEvent \u003Csel>` | Click element by CSS selector |\n| `cdp Input insertText \u003Ctext>` | Insert text at focused element |\n| `cdp Input fill \u003Cselector> \u003Ctext>` | Focus + fill text into element |\n\n**Multi-WebView targeting:** If the app has multiple BlazorWebViews, use `cdp webviews`\nto list them, then `--webview \u003Cindex-or-automationId>` on any command to target a specific one.\nExample: `maui devflow webview --webview 1 snapshot` or `maui devflow webview -w MyWebView Runtime evaluate \"1+1\"`.\n\n### maui devflow broker & discovery\n\nThe broker is a background daemon that manages port assignments for all running agents.\nThe CLI auto-starts the broker on first use — no manual setup needed.\n\n| Command | Description |\n|---------|-------------|\n| `list` | Show all registered agents (ID, app, platform, TFM, port, uptime) |\n| `wait [--timeout 120] [--project path] [--wait-platform P] [--json]` | Wait for an agent to connect. Outputs the port (or JSON with `--json`). Useful after `dotnet build -t:Run` to block until the app is ready |\n| `broker status` | Broker daemon status and connected agent count |\n| `broker start` | Start broker daemon (auto-started by CLI — rarely needed manually) |\n| `broker stop` | Stop broker daemon |\n| `broker log` | Show broker log file |\n\n### maui devflow batch (Multi-Command Execution)\n\nExecute multiple commands in one invocation via stdin. Returns JSONL responses. Use for\nmulti-step interactions to avoid repeated port resolution.\n\n```bash\necho \"ui fill textUsername user; ui fill textPassword pwd123; ui tap buttonLogin\" | maui devflow batch\n```\n\nFor full options, JSONL format, and streaming details, see [references\u002Fbatch.md](references\u002Fbatch.md).\n\n## Platform Details\n\nFor detailed platform-specific setup, simulator\u002Femulator management, and troubleshooting:\n\n- **Setup & Installation**: See [references\u002Fsetup.md](references\u002Fsetup.md)\n- **iOS \u002F Mac Catalyst**: See [references\u002Fios-and-mac.md](references\u002Fios-and-mac.md)\n- **macOS (AppKit)**: See [references\u002Fmacos.md](references\u002Fmacos.md)\n- **Android**: See [references\u002Fandroid.md](references\u002Fandroid.md)\n- **Linux \u002F GTK**: See [references\u002Flinux.md](references\u002Flinux.md)\n- **Troubleshooting**: See [references\u002Ftroubleshooting.md](references\u002Ftroubleshooting.md)\n\n## ⚠️ Non-Disruptive Operation\n\n**CRITICAL:** Never run commands that steal focus, move windows, simulate mouse\u002Fkeyboard input,\nor otherwise disrupt the user's desktop. The user is likely working on the same computer.\n\nSome platform reference notes mention `osascript` or `xdotool`. Treat those as **implementation\ndetails or explicit-consent edge cases**, not the default debugging workflow.\n\n**Never directly use:**\n- `osascript` to focus\u002Factivate windows, click UI elements, send keystrokes, or change host macOS appearance without the user's approval\n- `screencapture` interactively (the MauiDevFlow screenshot command captures in-process instead)\n- `xdotool` focus\u002Factivate\u002Fkey commands from the shell that affect the active window\n- Any command that moves the mouse cursor or simulates input at the OS level\n- `open -a` to bring apps to the foreground (use `open` only to launch, not to focus)\n\n**Instead:** All inspection and interaction goes through `maui devflow` CLI commands, which\ncommunicate with the in-app agent over HTTP — no foreground focus required. Simulator-scoped\ncommands such as `xcrun simctl privacy`, `xcrun simctl ui \u003CUDID> appearance ...`, and\n`xcrun simctl io screenshot` are fine because they target the simulator rather than the user's\ndesktop. If recovery requires OS-level control outside the app, **ask the user** to do it\nmanually or get explicit approval before making a disruptive host-level change.\n\n## Tips\n\n- **`maui devflow list` shows runtime state, not project integration.** Empty list ≠ \"not installed.\"\n  Always check project files (`grep -rl \"MauiDevFlow\" --include=\"*.csproj\" .`) before concluding DevFlow is unavailable.\n- **`maui devflow diagnose`** is the fastest way to check the entire chain: CLI → broker → agents → projects.\n- After launching through Aspire, always run `maui devflow wait` before attempting any interaction.\n- **Use `maui devflow batch`** for multi-step interactions — resolves port once, adds delays,\n  returns structured JSONL. See [references\u002Fbatch.md](references\u002Fbatch.md).\n- **Always use `maui devflow ui screenshot`** — captures in-process, app does NOT need\n  foreground focus.\n- Use `AutomationId` on important MAUI controls for stable element references.\n- For Blazor Hybrid, `cdp snapshot` is the most AI-friendly way to read page state.\n- Port discovery, multi-project setup, and custom ports: see [references\u002Fsetup.md](references\u002Fsetup.md#3b-port-configuration).\n- **Shell apps:** Read `AppShell.xaml` to discover routes before navigating. Routes are\n  case-sensitive and often lowercase.\n- **CollectionView items:** Tap the container Grid\u002FStackLayout, not inner Labels\u002FImages.\n  Use `--item-index` to scroll to off-screen items.\n- **Ambiguous `--text`:** When text appears on multiple pages, use explicit IDs from `tree`.\n\n## AI Agent Best Practices\n\n### Output Format\n- **Always use `--json`** or rely on TTY auto-detection (JSON is auto-enabled when stdout is piped\u002Fredirected).\n- Set `MAUIDEVFLOW_OUTPUT=json` in your environment for consistent machine-readable output.\n- Use `--no-json` only when you specifically need human-readable output in a pipe.\n- Errors go to stderr as structured JSON: `{\"error\": \"...\", \"type\": \"RuntimeError\", \"retryable\": false, \"suggestions\": [...]}`.\n- Check exit codes: 0 = success, non-zero = failure.\n\n### Reducing Token Usage\n- **Use `--depth 15`** (or higher) for `MAUI tree` — MAUI visual trees are deeply nested (a simple\n  control is often at depth 10-15). Start with `--depth 15`; if you see truncated children, increase.\n  After your first successful tree dump, note the depth where meaningful controls appear and reuse\n  that depth for subsequent calls. If the tree is still too large, combine with `--fields` to reduce width.\n- Use **`--fields \"id,type,text,automationId\"`** to project only the fields you need.\n- Use **`--format compact`** for minimal tree output (id, type, text, automationId, bounds).\n- **Prefer `MAUI query --automationId`** over full tree traversal — much smaller response.\n- Use **element-level screenshots** (`--id \u003CelementId>`) when you only need to see one control.\n\n### Adaptive Depth Learning\nMAUI app trees vary in depth — a simple app might have controls at depth 8, while a complex app\nwith Shell + NavigationPage + nested layouts might need depth 20+. After your first `MAUI tree`\ncall, look at where the leaf-level controls (Button, Entry, Label) appear and remember that depth.\nUse it for all subsequent tree calls in the same session. If you navigate to a new page that seems\ndeeper, bump the depth up. This avoids both truncating useful content and wasting tokens on\nexcessively deep dumps.\n\n### Screenshot Auto-Scaling (HiDPI)\nScreenshots are **automatically scaled to 1x logical resolution** by default. The agent detects\nthe device's display density (2x on Retina, 3x on iPhone Pro Max, 1x on desktop) and divides\nthe screenshot dimensions accordingly. This happens server-side before transfer.\n\n- **No action needed** — just use `maui devflow ui screenshot --output screen.png` and the\n  image will be appropriately sized for AI understanding.\n- **Full resolution:** Use `--scale native` when you need pixel-perfect images (e.g., verifying\n  exact colors, alignment, or anti-aliasing).\n  ```bash\n  maui devflow ui screenshot --output full-res.png --scale native\n  ```\n- **Explicit max width:** Use `--max-width N` to override auto-scaling with a specific pixel width.\n  ```bash\n  maui devflow ui screenshot --output screen.png --max-width 600\n  ```\n\n### Eliminating Round-Trips\n- **Use implicit resolution** instead of query-then-act:\n  ```bash\n  # Instead of: query → get ID → tap\n  maui devflow ui tap --automationId \"LoginButton\"\n  maui devflow ui fill --automationId \"Username\" \"admin\"\n  maui devflow ui tap --type Button --index 0  # first Button\n  ```\n- **Use `--wait-until`** instead of polling loops:\n  ```bash\n  maui devflow ui query --automationId \"ResultsList\" --wait-until exists --timeout 10\n  maui devflow ui query --automationId \"Spinner\" --wait-until gone --timeout 30\n  ```\n- **Use post-action flags** to verify in one call:\n  ```bash\n  maui devflow ui tap abc123 --and-screenshot --and-tree --and-tree-depth 5\n  ```\n- **Use `MAUI assert`** for quick state checks:\n  ```bash\n  maui devflow ui assert --id abc123 Text \"Welcome!\"\n  maui devflow ui assert --automationId \"Counter\" Text \"5\"\n  ```\n\n### Element IDs\n- Element IDs are **ephemeral** — re-query after navigation or state changes.\n- Don't cache element IDs across multiple actions — refresh with `tree` or `query`.\n- Prefer `--automationId` for stable references (set in XAML).\n- Use `maui devflow commands --json` to discover available commands at runtime.\n\n### Shell Navigation\n- **Routes are case-sensitive** and come from `ShellContent Route=\"\"` in XAML, not from\n  `FlyoutItem Title`. Discover routes by reading `AppShell.xaml`:\n  ```bash\n  grep -i 'Route=' AppShell.xaml\n  ```\n- **Flyout menu items** use generated IDs like `FlyoutItem_D_FAULT_FlyoutItem0`. Find them\n  at the top level of the tree output. Don't try to tap Labels inside flyout items.\n- **Flyout dismissal:** After tapping a flyout item, the flyout may stay open. Dismiss with:\n  ```bash\n  maui devflow ui set-property \u003CshellId> FlyoutIsPresented \"false\"\n  ```\n\n### CollectionView \u002F ListView\n- **Tapping items:** Always tap the item's container (Grid\u002FStackLayout), not inner elements\n  (Label\u002FImage). The item template's root element handles selection.\n- **Virtualization:** CollectionView\u002FListView use item virtualization — only visible items\n  (plus a small buffer) exist in the visual tree. Off-screen items have NO visual element.\n  The tree shows `itemCount` in the CollectionView's properties so you know total items.\n- **Scrolling by item index** (best for reaching off-screen items):\n  ```bash\n  maui devflow ui scroll --element \u003CcvId> --item-index 20 --position Center\n  ```\n  This works even for items not in the tree yet — the platform scrolls to materialize them.\n- **Scrolling by pixel delta** (for fine-grained scrolling):\n  ```bash\n  maui devflow ui scroll --element \u003CcvId> --dy -500\n  ```\n  Uses native platform scroll (UIScrollView\u002FRecyclerView) — works on CollectionView.\n- **Workflow:** Get tree → note `itemCount` → scroll by index → re-query tree → interact:\n  ```bash\n  maui devflow ui tree --depth 15   # CollectionView shows itemCount: 25\n  maui devflow ui scroll --item-index 20\n  maui devflow ui tree --depth 15   # items around index 20 now visible\n  ```\n\n### Implicit Resolution Gotchas\n- **`--text` searches the entire visual tree**, including hidden pages (other Shell tabs).\n  If the text is ambiguous (e.g., `\"+\"`, `\"OK\"`, `\"Cancel\"`), it may match a wrong element\n  on a different page.\n- **Prefer `--automationId`** for reliable targeting. Fall back to explicit element IDs from\n  `tree`\u002F`query` for elements without AutomationIds.\n- **Use `--type` + `--text` together** to narrow matches when text alone is ambiguous.\n\n### Canonical Workflows\n\n**Login flow:**\n```bash\nmaui devflow ui query --automationId \"LoginPage\" --wait-until exists --timeout 15\nmaui devflow ui fill --automationId \"UsernameField\" \"admin\"\nmaui devflow ui fill --automationId \"PasswordField\" \"password\"\nmaui devflow ui tap --automationId \"LoginButton\" --and-screenshot\nmaui devflow ui query --automationId \"HomePage\" --wait-until exists --timeout 10\n```\n\n**Shell navigation:**\n```bash\n# Discover routes from XAML\ngrep -i 'Route=' AppShell.xaml                              # find route names\nmaui devflow ui navigate \"\u002F\u002Fhome\"                         # navigate to a route\nmaui devflow ui tap FlyoutButton                          # open flyout\nmaui devflow ui tree --depth 3 --fields \"id,type,text\"    # find flyout items\nmaui devflow ui tap \u003CflyoutItemId>                        # tap item\nmaui devflow ui set-property \u003CshellId> FlyoutIsPresented \"false\"  # dismiss flyout\n```\n\n**Element inspection:**\n```bash\nmaui devflow ui query --automationId \"MyControl\" --json --fields \"id,type,text,bounds\"\nmaui devflow ui element \u003Cid> --json\nmaui devflow ui property \u003Cid> Text\n```\n\n**State verification:**\n```bash\nmaui devflow ui tap --automationId \"IncrementButton\"\nmaui devflow ui assert --automationId \"CounterLabel\" Text \"1\"\n```\n",{"data":47,"body":48},{"name":4,"description":6},{"type":49,"children":50},"root",[51,59,90,102,109,251,271,277,290,296,308,316,488,494,501,506,514,580,593,601,677,685,783,800,816,874,887,893,903,930,942,950,1106,1114,1259,1269,1275,1309,1368,1387,1393,1398,1415,1450,1458,1748,1756,1832,1849,1904,1929,1939,2032,2049,2055,2063,2165,2175,2276,2284,2398,2403,2411,2471,2479,2526,2576,2697,2709,2717,2796,2802,2823,3053,3078,3084,3089,3304,3314,3382,3415,3421,3450,3715,3723,3796,3814,3864,3882,3888,3893,4328,4345,4351,4356,4632,4638,4643,4851,4928,4967,4973,4979,4984,5047,5101,5134,6061,6103,6120,6126,6159,6451,6491,6497,6502,6637,6643,6648,6695,6706,6712,6717,6801,6807,6817,6844,6852,6909,6957,6963,7144,7150,7156,7213,7219,7322,7328,7340,7346,7358,7502,7508,7979,7985,8041,8047,8208,8214,8513,8519,8610,8616,8624,8872,8880,9142,9150,9294,9302,9398],{"type":52,"tag":53,"props":54,"children":55},"element","h1",{"id":4},[56],{"type":57,"value":58},"text","MAUI AI Debugging",{"type":52,"tag":60,"props":61,"children":62},"p",{},[63,65,72,74,80,82,88],{"type":57,"value":64},"Compatibility note: this legacy skill name is retained for older clients. The canonical\nreplacement is ",{"type":52,"tag":66,"props":67,"children":69},"code",{"className":68},[],[70],{"type":57,"value":71},"maui-devflow-debug",{"type":57,"value":73},", installed through ",{"type":52,"tag":66,"props":75,"children":77},{"className":76},[],[78],{"type":57,"value":79},"maui devflow init",{"type":57,"value":81}," \u002F\n",{"type":52,"tag":66,"props":83,"children":85},{"className":84},[],[86],{"type":57,"value":87},"maui devflow skills update",{"type":57,"value":89},".",{"type":52,"tag":60,"props":91,"children":92},{},[93,95,101],{"type":57,"value":94},"Build, deploy, inspect, and debug .NET MAUI apps from the terminal. This skill enables a complete\nfeedback loop: ",{"type":52,"tag":96,"props":97,"children":98},"strong",{},[99],{"type":57,"value":100},"build → deploy → inspect → fix → rebuild",{"type":57,"value":89},{"type":52,"tag":103,"props":104,"children":106},"h2",{"id":105},"prerequisites",[107],{"type":57,"value":108},"Prerequisites",{"type":52,"tag":110,"props":111,"children":116},"pre",{"className":112,"code":113,"language":114,"meta":115,"style":115},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dotnet tool install --global Microsoft.Maui.Cli --prerelease || dotnet tool update --global Microsoft.Maui.Cli --prerelease\ndotnet tool install --global androidsdk.tool    # Android only\ndotnet tool install --global appledev.tools     # iOS\u002FMac only\n","bash","",[117],{"type":52,"tag":66,"props":118,"children":119},{"__ignoreMap":115},[120,190,221],{"type":52,"tag":121,"props":122,"children":125},"span",{"class":123,"line":124},"line",1,[126,131,137,142,147,152,157,163,168,172,177,181,185],{"type":52,"tag":121,"props":127,"children":129},{"style":128},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[130],{"type":57,"value":8},{"type":52,"tag":121,"props":132,"children":134},{"style":133},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[135],{"type":57,"value":136}," tool",{"type":52,"tag":121,"props":138,"children":139},{"style":133},[140],{"type":57,"value":141}," install",{"type":52,"tag":121,"props":143,"children":144},{"style":133},[145],{"type":57,"value":146}," --global",{"type":52,"tag":121,"props":148,"children":149},{"style":133},[150],{"type":57,"value":151}," Microsoft.Maui.Cli",{"type":52,"tag":121,"props":153,"children":154},{"style":133},[155],{"type":57,"value":156}," --prerelease",{"type":52,"tag":121,"props":158,"children":160},{"style":159},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[161],{"type":57,"value":162}," ||",{"type":52,"tag":121,"props":164,"children":165},{"style":128},[166],{"type":57,"value":167}," dotnet",{"type":52,"tag":121,"props":169,"children":170},{"style":133},[171],{"type":57,"value":136},{"type":52,"tag":121,"props":173,"children":174},{"style":133},[175],{"type":57,"value":176}," update",{"type":52,"tag":121,"props":178,"children":179},{"style":133},[180],{"type":57,"value":146},{"type":52,"tag":121,"props":182,"children":183},{"style":133},[184],{"type":57,"value":151},{"type":52,"tag":121,"props":186,"children":187},{"style":133},[188],{"type":57,"value":189}," --prerelease\n",{"type":52,"tag":121,"props":191,"children":193},{"class":123,"line":192},2,[194,198,202,206,210,215],{"type":52,"tag":121,"props":195,"children":196},{"style":128},[197],{"type":57,"value":8},{"type":52,"tag":121,"props":199,"children":200},{"style":133},[201],{"type":57,"value":136},{"type":52,"tag":121,"props":203,"children":204},{"style":133},[205],{"type":57,"value":141},{"type":52,"tag":121,"props":207,"children":208},{"style":133},[209],{"type":57,"value":146},{"type":52,"tag":121,"props":211,"children":212},{"style":133},[213],{"type":57,"value":214}," androidsdk.tool",{"type":52,"tag":121,"props":216,"children":218},{"style":217},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[219],{"type":57,"value":220},"    # Android only\n",{"type":52,"tag":121,"props":222,"children":224},{"class":123,"line":223},3,[225,229,233,237,241,246],{"type":52,"tag":121,"props":226,"children":227},{"style":128},[228],{"type":57,"value":8},{"type":52,"tag":121,"props":230,"children":231},{"style":133},[232],{"type":57,"value":136},{"type":52,"tag":121,"props":234,"children":235},{"style":133},[236],{"type":57,"value":141},{"type":52,"tag":121,"props":238,"children":239},{"style":133},[240],{"type":57,"value":146},{"type":52,"tag":121,"props":242,"children":243},{"style":133},[244],{"type":57,"value":245}," appledev.tools",{"type":52,"tag":121,"props":247,"children":248},{"style":217},[249],{"type":57,"value":250},"     # iOS\u002FMac only\n",{"type":52,"tag":60,"props":252,"children":253},{},[254,256,261,263,269],{"type":57,"value":255},"Keep DevFlow skills up to date with ",{"type":52,"tag":66,"props":257,"children":259},{"className":258},[],[260],{"type":57,"value":87},{"type":57,"value":262},". The hidden\n",{"type":52,"tag":66,"props":264,"children":266},{"className":265},[],[267],{"type":57,"value":268},"maui devflow update-skill",{"type":57,"value":270}," compatibility command runs the same bundled updater\nand may remove this legacy skill after installing current replacements.",{"type":52,"tag":103,"props":272,"children":274},{"id":273},"optional-session-feedback-nudge",[275],{"type":57,"value":276},"Optional Session Feedback Nudge",{"type":52,"tag":60,"props":278,"children":279},{},[280,282,288],{"type":57,"value":281},"If this legacy workflow involved repeated DevFlow retries, unclear workarounds,\nor a long debugging session, ask whether the user wants to run\n",{"type":52,"tag":66,"props":283,"children":285},{"className":284},[],[286],{"type":57,"value":287},"maui-devflow-session-review",{"type":57,"value":289}," to summarize friction for MAUI DevFlow product\nfeedback. Do not run it automatically.",{"type":52,"tag":103,"props":291,"children":293},{"id":292},"integrating-mauidevflow-into-a-maui-app",[294],{"type":57,"value":295},"Integrating MauiDevFlow into a MAUI App",{"type":52,"tag":60,"props":297,"children":298},{},[299,301,307],{"type":57,"value":300},"For complete setup instructions, see ",{"type":52,"tag":302,"props":303,"children":305},"a",{"href":304},"references\u002Fsetup.md",[306],{"type":57,"value":304},{"type":57,"value":89},{"type":52,"tag":60,"props":309,"children":310},{},[311],{"type":52,"tag":96,"props":312,"children":313},{},[314],{"type":57,"value":315},"Quick summary:",{"type":52,"tag":317,"props":318,"children":319},"ol",{},[320,415,434,439,452,465,470],{"type":52,"tag":321,"props":322,"children":323},"li",{},[324,326,332,334,340,342],{"type":57,"value":325},"Add NuGet packages (",{"type":52,"tag":66,"props":327,"children":329},{"className":328},[],[330],{"type":57,"value":331},"Microsoft.Maui.DevFlow.Agent",{"type":57,"value":333},", and ",{"type":52,"tag":66,"props":335,"children":337},{"className":336},[],[338],{"type":57,"value":339},"Microsoft.Maui.DevFlow.Blazor",{"type":57,"value":341}," for Blazor Hybrid)\n",{"type":52,"tag":343,"props":344,"children":345},"ul",{},[346,382],{"type":52,"tag":321,"props":347,"children":348},{},[349,351,356,358,364,366,372,374,380],{"type":57,"value":350},"For ",{"type":52,"tag":96,"props":352,"children":353},{},[354],{"type":57,"value":355},"Linux\u002FGTK apps",{"type":57,"value":357}," (detected via ",{"type":52,"tag":66,"props":359,"children":361},{"className":360},[],[362],{"type":57,"value":363},"grep -i 'GirCore\\|Maui\\.Gtk' *.csproj",{"type":57,"value":365},"), use ",{"type":52,"tag":66,"props":367,"children":369},{"className":368},[],[370],{"type":57,"value":371},"Agent.Gtk",{"type":57,"value":373}," and ",{"type":52,"tag":66,"props":375,"children":377},{"className":376},[],[378],{"type":57,"value":379},"Blazor.Gtk",{"type":57,"value":381}," instead",{"type":52,"tag":321,"props":383,"children":384},{},[385,386,391,392,398,400,406,407,413],{"type":57,"value":350},{"type":52,"tag":96,"props":387,"children":388},{},[389],{"type":57,"value":390},"macOS (AppKit) apps",{"type":57,"value":357},{"type":52,"tag":66,"props":393,"children":395},{"className":394},[],[396],{"type":57,"value":397},"grep -i 'Platform\\.Maui\\.MacOS' *.csproj",{"type":57,"value":399},"), the standard ",{"type":52,"tag":66,"props":401,"children":403},{"className":402},[],[404],{"type":57,"value":405},"Agent",{"type":57,"value":373},{"type":52,"tag":66,"props":408,"children":410},{"className":409},[],[411],{"type":57,"value":412},"Blazor",{"type":57,"value":414}," packages include macOS support",{"type":52,"tag":321,"props":416,"children":417},{},[418,420,426,428],{"type":57,"value":419},"Register in ",{"type":52,"tag":66,"props":421,"children":423},{"className":422},[],[424],{"type":57,"value":425},"MauiProgram.cs",{"type":57,"value":427}," inside ",{"type":52,"tag":66,"props":429,"children":431},{"className":430},[],[432],{"type":57,"value":433},"#if DEBUG",{"type":52,"tag":321,"props":435,"children":436},{},[437],{"type":57,"value":438},"For Blazor Hybrid: chobitsu.js is auto-injected (no manual script tag needed)",{"type":52,"tag":321,"props":440,"children":441},{},[442,444,450],{"type":57,"value":443},"For Mac Catalyst: ensure ",{"type":52,"tag":66,"props":445,"children":447},{"className":446},[],[448],{"type":57,"value":449},"network.server",{"type":57,"value":451}," entitlement",{"type":52,"tag":321,"props":453,"children":454},{},[455,457,463],{"type":57,"value":456},"For Android: run ",{"type":52,"tag":66,"props":458,"children":460},{"className":459},[],[461],{"type":57,"value":462},"adb reverse",{"type":57,"value":464}," for broker + agent ports",{"type":52,"tag":321,"props":466,"children":467},{},[468],{"type":57,"value":469},"For Linux: no special network setup needed (direct localhost)",{"type":52,"tag":321,"props":471,"children":472},{},[473,475,481,483],{"type":57,"value":474},"For macOS (AppKit): separate app head project, uses ",{"type":52,"tag":66,"props":476,"children":478},{"className":477},[],[479],{"type":57,"value":480},"open App.app",{"type":57,"value":482}," to launch. See ",{"type":52,"tag":302,"props":484,"children":486},{"href":485},"references\u002Fmacos.md",[487],{"type":57,"value":485},{"type":52,"tag":103,"props":489,"children":491},{"id":490},"core-workflow",[492],{"type":57,"value":493},"Core Workflow",{"type":52,"tag":495,"props":496,"children":498},"h3",{"id":497},"_0-verify-devflow-availability",[499],{"type":57,"value":500},"0. Verify DevFlow Availability",{"type":52,"tag":60,"props":502,"children":503},{},[504],{"type":57,"value":505},"Before building or launching anything, determine if DevFlow is available for the current project.",{"type":52,"tag":60,"props":507,"children":508},{},[509],{"type":52,"tag":96,"props":510,"children":511},{},[512],{"type":57,"value":513},"Check integration (project files — the source of truth):",{"type":52,"tag":110,"props":515,"children":517},{"className":112,"code":516,"language":114,"meta":115,"style":115},"# Check if any csproj in the project has DevFlow packages\ngrep -rl \"MauiDevFlow\\|Maui\\.DevFlow\" --include=\"*.csproj\" .\n",[518],{"type":52,"tag":66,"props":519,"children":520},{"__ignoreMap":115},[521,529],{"type":52,"tag":121,"props":522,"children":523},{"class":123,"line":124},[524],{"type":52,"tag":121,"props":525,"children":526},{"style":217},[527],{"type":57,"value":528},"# Check if any csproj in the project has DevFlow packages\n",{"type":52,"tag":121,"props":530,"children":531},{"class":123,"line":192},[532,537,542,547,552,557,562,566,571,575],{"type":52,"tag":121,"props":533,"children":534},{"style":128},[535],{"type":57,"value":536},"grep",{"type":52,"tag":121,"props":538,"children":539},{"style":133},[540],{"type":57,"value":541}," -rl",{"type":52,"tag":121,"props":543,"children":544},{"style":159},[545],{"type":57,"value":546}," \"",{"type":52,"tag":121,"props":548,"children":549},{"style":133},[550],{"type":57,"value":551},"MauiDevFlow\\|Maui\\.DevFlow",{"type":52,"tag":121,"props":553,"children":554},{"style":159},[555],{"type":57,"value":556},"\"",{"type":52,"tag":121,"props":558,"children":559},{"style":133},[560],{"type":57,"value":561}," --include=",{"type":52,"tag":121,"props":563,"children":564},{"style":159},[565],{"type":57,"value":556},{"type":52,"tag":121,"props":567,"children":568},{"style":133},[569],{"type":57,"value":570},"*.csproj",{"type":52,"tag":121,"props":572,"children":573},{"style":159},[574],{"type":57,"value":556},{"type":52,"tag":121,"props":576,"children":577},{"style":133},[578],{"type":57,"value":579}," .\n",{"type":52,"tag":60,"props":581,"children":582},{},[583,585,591],{"type":57,"value":584},"If grep returns results, DevFlow IS integrated — even if ",{"type":52,"tag":66,"props":586,"children":588},{"className":587},[],[589],{"type":57,"value":590},"maui devflow list",{"type":57,"value":592}," shows nothing.",{"type":52,"tag":60,"props":594,"children":595},{},[596],{"type":52,"tag":96,"props":597,"children":598},{},[599],{"type":57,"value":600},"Check runtime connection:",{"type":52,"tag":110,"props":602,"children":604},{"className":112,"code":603,"language":114,"meta":115,"style":115},"maui devflow list                          # shows connected agents\nmaui devflow broker status                 # shows broker health\nmaui devflow diagnose                      # full end-to-end health check (recommended)\n",[605],{"type":52,"tag":66,"props":606,"children":607},{"__ignoreMap":115},[608,630,656],{"type":52,"tag":121,"props":609,"children":610},{"class":123,"line":124},[611,615,620,625],{"type":52,"tag":121,"props":612,"children":613},{"style":128},[614],{"type":57,"value":14},{"type":52,"tag":121,"props":616,"children":617},{"style":133},[618],{"type":57,"value":619}," devflow",{"type":52,"tag":121,"props":621,"children":622},{"style":133},[623],{"type":57,"value":624}," list",{"type":52,"tag":121,"props":626,"children":627},{"style":217},[628],{"type":57,"value":629},"                          # shows connected agents\n",{"type":52,"tag":121,"props":631,"children":632},{"class":123,"line":192},[633,637,641,646,651],{"type":52,"tag":121,"props":634,"children":635},{"style":128},[636],{"type":57,"value":14},{"type":52,"tag":121,"props":638,"children":639},{"style":133},[640],{"type":57,"value":619},{"type":52,"tag":121,"props":642,"children":643},{"style":133},[644],{"type":57,"value":645}," broker",{"type":52,"tag":121,"props":647,"children":648},{"style":133},[649],{"type":57,"value":650}," status",{"type":52,"tag":121,"props":652,"children":653},{"style":217},[654],{"type":57,"value":655},"                 # shows broker health\n",{"type":52,"tag":121,"props":657,"children":658},{"class":123,"line":223},[659,663,667,672],{"type":52,"tag":121,"props":660,"children":661},{"style":128},[662],{"type":57,"value":14},{"type":52,"tag":121,"props":664,"children":665},{"style":133},[666],{"type":57,"value":619},{"type":52,"tag":121,"props":668,"children":669},{"style":133},[670],{"type":57,"value":671}," diagnose",{"type":52,"tag":121,"props":673,"children":674},{"style":217},[675],{"type":57,"value":676},"                      # full end-to-end health check (recommended)\n",{"type":52,"tag":60,"props":678,"children":679},{},[680],{"type":52,"tag":96,"props":681,"children":682},{},[683],{"type":57,"value":684},"Decision tree — what to do based on results:",{"type":52,"tag":686,"props":687,"children":688},"table",{},[689,721],{"type":52,"tag":690,"props":691,"children":692},"thead",{},[693],{"type":52,"tag":694,"props":695,"children":696},"tr",{},[697,703,716],{"type":52,"tag":698,"props":699,"children":700},"th",{},[701],{"type":57,"value":702},"Project has DevFlow packages?",{"type":52,"tag":698,"props":704,"children":705},{},[706,708,714],{"type":57,"value":707},"Agent in ",{"type":52,"tag":66,"props":709,"children":711},{"className":710},[],[712],{"type":57,"value":713},"list",{"type":57,"value":715},"?",{"type":52,"tag":698,"props":717,"children":718},{},[719],{"type":57,"value":720},"Action",{"type":52,"tag":722,"props":723,"children":724},"tbody",{},[725,743,766],{"type":52,"tag":694,"props":726,"children":727},{},[728,734,738],{"type":52,"tag":729,"props":730,"children":731},"td",{},[732],{"type":57,"value":733},"✅ Yes",{"type":52,"tag":729,"props":735,"children":736},{},[737],{"type":57,"value":733},{"type":52,"tag":729,"props":739,"children":740},{},[741],{"type":57,"value":742},"Ready — proceed to inspection\u002Finteraction",{"type":52,"tag":694,"props":744,"children":745},{},[746,750,755],{"type":52,"tag":729,"props":747,"children":748},{},[749],{"type":57,"value":733},{"type":52,"tag":729,"props":751,"children":752},{},[753],{"type":57,"value":754},"❌ No",{"type":52,"tag":729,"props":756,"children":757},{},[758,760],{"type":57,"value":759},"App not running in Debug, or broker issue. Launch app, then ",{"type":52,"tag":66,"props":761,"children":763},{"className":762},[],[764],{"type":57,"value":765},"maui devflow wait",{"type":52,"tag":694,"props":767,"children":768},{},[769,773,778],{"type":52,"tag":729,"props":770,"children":771},{},[772],{"type":57,"value":754},{"type":52,"tag":729,"props":774,"children":775},{},[776],{"type":57,"value":777},"—",{"type":52,"tag":729,"props":779,"children":780},{},[781],{"type":57,"value":782},"Need to integrate DevFlow (see \"Integrating MauiDevFlow into a MAUI App\")",{"type":52,"tag":60,"props":784,"children":785},{},[786,791,793,798],{"type":52,"tag":96,"props":787,"children":788},{},[789],{"type":57,"value":790},"⚠️ CRITICAL:",{"type":57,"value":792}," ",{"type":52,"tag":66,"props":794,"children":796},{"className":795},[],[797],{"type":57,"value":590},{"type":57,"value":799}," shows RUNTIME state (connected agents), NOT project integration.\nAn empty list does NOT mean \"DevFlow is not installed.\" Always check project files first.",{"type":52,"tag":60,"props":801,"children":802},{},[803],{"type":52,"tag":96,"props":804,"children":805},{},[806,808,814],{"type":57,"value":807},"After launching the app (via ",{"type":52,"tag":66,"props":809,"children":811},{"className":810},[],[812],{"type":57,"value":813},"dotnet build -t:Run",{"type":57,"value":815}," or through Aspire):",{"type":52,"tag":110,"props":817,"children":819},{"className":112,"code":818,"language":114,"meta":115,"style":115},"maui devflow wait                          # blocks until agent connects (default 120s)\nmaui devflow wait --project path\u002Fto\u002FApp.csproj  # filter to specific project\n",[820],{"type":52,"tag":66,"props":821,"children":822},{"__ignoreMap":115},[823,844],{"type":52,"tag":121,"props":824,"children":825},{"class":123,"line":124},[826,830,834,839],{"type":52,"tag":121,"props":827,"children":828},{"style":128},[829],{"type":57,"value":14},{"type":52,"tag":121,"props":831,"children":832},{"style":133},[833],{"type":57,"value":619},{"type":52,"tag":121,"props":835,"children":836},{"style":133},[837],{"type":57,"value":838}," wait",{"type":52,"tag":121,"props":840,"children":841},{"style":217},[842],{"type":57,"value":843},"                          # blocks until agent connects (default 120s)\n",{"type":52,"tag":121,"props":845,"children":846},{"class":123,"line":192},[847,851,855,859,864,869],{"type":52,"tag":121,"props":848,"children":849},{"style":128},[850],{"type":57,"value":14},{"type":52,"tag":121,"props":852,"children":853},{"style":133},[854],{"type":57,"value":619},{"type":52,"tag":121,"props":856,"children":857},{"style":133},[858],{"type":57,"value":838},{"type":52,"tag":121,"props":860,"children":861},{"style":133},[862],{"type":57,"value":863}," --project",{"type":52,"tag":121,"props":865,"children":866},{"style":133},[867],{"type":57,"value":868}," path\u002Fto\u002FApp.csproj",{"type":52,"tag":121,"props":870,"children":871},{"style":217},[872],{"type":57,"value":873},"  # filter to specific project\n",{"type":52,"tag":60,"props":875,"children":876},{},[877,879,885],{"type":57,"value":878},"ALWAYS run ",{"type":52,"tag":66,"props":880,"children":882},{"className":881},[],[883],{"type":57,"value":884},"wait",{"type":57,"value":886}," after launching. Never assume the agent is connected — verify it.",{"type":52,"tag":495,"props":888,"children":890},{"id":889},"_1-ensure-a-devicesimulatoremulator-is-running",[891],{"type":57,"value":892},"1. Ensure a Device\u002FSimulator\u002FEmulator is Running",{"type":52,"tag":60,"props":894,"children":895},{},[896,901],{"type":52,"tag":96,"props":897,"children":898},{},[899],{"type":57,"value":900},"⚠️ Multi-project conflict avoidance:",{"type":57,"value":902}," When multiple projects may run simultaneously\n(common with AI agents), each project should use its own dedicated simulator\u002Femulator to\nprevent apps from replacing each other. Check what's already in use first:",{"type":52,"tag":110,"props":904,"children":906},{"className":112,"code":905,"language":114,"meta":115,"style":115},"maui devflow list     # check if any agents are already connected (runtime state only — see Step 0 for integration check)\n",[907],{"type":52,"tag":66,"props":908,"children":909},{"__ignoreMap":115},[910],{"type":52,"tag":121,"props":911,"children":912},{"class":123,"line":124},[913,917,921,925],{"type":52,"tag":121,"props":914,"children":915},{"style":128},[916],{"type":57,"value":14},{"type":52,"tag":121,"props":918,"children":919},{"style":133},[920],{"type":57,"value":619},{"type":52,"tag":121,"props":922,"children":923},{"style":133},[924],{"type":57,"value":624},{"type":52,"tag":121,"props":926,"children":927},{"style":217},[928],{"type":57,"value":929},"     # check if any agents are already connected (runtime state only — see Step 0 for integration check)\n",{"type":52,"tag":60,"props":931,"children":932},{},[933,935,940],{"type":57,"value":934},"If another iOS or Android agent is already registered, ",{"type":52,"tag":96,"props":936,"children":937},{},[938],{"type":57,"value":939},"create a new simulator\u002Femulator",{"type":57,"value":941},"\nfor your project instead of reusing the one that's already booted.",{"type":52,"tag":60,"props":943,"children":944},{},[945],{"type":52,"tag":96,"props":946,"children":947},{},[948],{"type":57,"value":949},"iOS Simulator:",{"type":52,"tag":110,"props":951,"children":953},{"className":112,"code":952,"language":114,"meta":115,"style":115},"xcrun simctl list devices booted                              # check booted sims\n\n# Create a project-dedicated simulator to avoid conflicts\nxcrun simctl create \"MyApp-iPhone17Pro\" \"iPhone 17 Pro\" \"iOS 26.2\"\nxcrun simctl boot \u003CUDID>                                      # boot the new sim\n",[954],{"type":52,"tag":66,"props":955,"children":956},{"__ignoreMap":115},[957,989,998,1006,1063],{"type":52,"tag":121,"props":958,"children":959},{"class":123,"line":124},[960,965,970,974,979,984],{"type":52,"tag":121,"props":961,"children":962},{"style":128},[963],{"type":57,"value":964},"xcrun",{"type":52,"tag":121,"props":966,"children":967},{"style":133},[968],{"type":57,"value":969}," simctl",{"type":52,"tag":121,"props":971,"children":972},{"style":133},[973],{"type":57,"value":624},{"type":52,"tag":121,"props":975,"children":976},{"style":133},[977],{"type":57,"value":978}," devices",{"type":52,"tag":121,"props":980,"children":981},{"style":133},[982],{"type":57,"value":983}," booted",{"type":52,"tag":121,"props":985,"children":986},{"style":217},[987],{"type":57,"value":988},"                              # check booted sims\n",{"type":52,"tag":121,"props":990,"children":991},{"class":123,"line":192},[992],{"type":52,"tag":121,"props":993,"children":995},{"emptyLinePlaceholder":994},true,[996],{"type":57,"value":997},"\n",{"type":52,"tag":121,"props":999,"children":1000},{"class":123,"line":223},[1001],{"type":52,"tag":121,"props":1002,"children":1003},{"style":217},[1004],{"type":57,"value":1005},"# Create a project-dedicated simulator to avoid conflicts\n",{"type":52,"tag":121,"props":1007,"children":1009},{"class":123,"line":1008},4,[1010,1014,1018,1023,1027,1032,1036,1040,1045,1049,1053,1058],{"type":52,"tag":121,"props":1011,"children":1012},{"style":128},[1013],{"type":57,"value":964},{"type":52,"tag":121,"props":1015,"children":1016},{"style":133},[1017],{"type":57,"value":969},{"type":52,"tag":121,"props":1019,"children":1020},{"style":133},[1021],{"type":57,"value":1022}," create",{"type":52,"tag":121,"props":1024,"children":1025},{"style":159},[1026],{"type":57,"value":546},{"type":52,"tag":121,"props":1028,"children":1029},{"style":133},[1030],{"type":57,"value":1031},"MyApp-iPhone17Pro",{"type":52,"tag":121,"props":1033,"children":1034},{"style":159},[1035],{"type":57,"value":556},{"type":52,"tag":121,"props":1037,"children":1038},{"style":159},[1039],{"type":57,"value":546},{"type":52,"tag":121,"props":1041,"children":1042},{"style":133},[1043],{"type":57,"value":1044},"iPhone 17 Pro",{"type":52,"tag":121,"props":1046,"children":1047},{"style":159},[1048],{"type":57,"value":556},{"type":52,"tag":121,"props":1050,"children":1051},{"style":159},[1052],{"type":57,"value":546},{"type":52,"tag":121,"props":1054,"children":1055},{"style":133},[1056],{"type":57,"value":1057},"iOS 26.2",{"type":52,"tag":121,"props":1059,"children":1060},{"style":159},[1061],{"type":57,"value":1062},"\"\n",{"type":52,"tag":121,"props":1064,"children":1066},{"class":123,"line":1065},5,[1067,1071,1075,1080,1085,1090,1096,1101],{"type":52,"tag":121,"props":1068,"children":1069},{"style":128},[1070],{"type":57,"value":964},{"type":52,"tag":121,"props":1072,"children":1073},{"style":133},[1074],{"type":57,"value":969},{"type":52,"tag":121,"props":1076,"children":1077},{"style":133},[1078],{"type":57,"value":1079}," boot",{"type":52,"tag":121,"props":1081,"children":1082},{"style":159},[1083],{"type":57,"value":1084}," \u003C",{"type":52,"tag":121,"props":1086,"children":1087},{"style":133},[1088],{"type":57,"value":1089},"UDI",{"type":52,"tag":121,"props":1091,"children":1093},{"style":1092},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1094],{"type":57,"value":1095},"D",{"type":52,"tag":121,"props":1097,"children":1098},{"style":159},[1099],{"type":57,"value":1100},">",{"type":52,"tag":121,"props":1102,"children":1103},{"style":217},[1104],{"type":57,"value":1105},"                                      # boot the new sim\n",{"type":52,"tag":60,"props":1107,"children":1108},{},[1109],{"type":52,"tag":96,"props":1110,"children":1111},{},[1112],{"type":57,"value":1113},"Android Emulator:",{"type":52,"tag":110,"props":1115,"children":1117},{"className":112,"code":1116,"language":114,"meta":115,"style":115},"android avd list                                              # list AVDs\n\n# Create a project-dedicated emulator to avoid conflicts\nandroid avd create --name \"MyApp-Pixel8\" \\\n  --sdk \"system-images;android-35;google_apis;arm64-v8a\" --device pixel_8\nandroid avd start --name \"MyApp-Pixel8\"\n",[1118],{"type":52,"tag":66,"props":1119,"children":1120},{"__ignoreMap":115},[1121,1142,1149,1157,1195,1226],{"type":52,"tag":121,"props":1122,"children":1123},{"class":123,"line":124},[1124,1128,1133,1137],{"type":52,"tag":121,"props":1125,"children":1126},{"style":128},[1127],{"type":57,"value":32},{"type":52,"tag":121,"props":1129,"children":1130},{"style":133},[1131],{"type":57,"value":1132}," avd",{"type":52,"tag":121,"props":1134,"children":1135},{"style":133},[1136],{"type":57,"value":624},{"type":52,"tag":121,"props":1138,"children":1139},{"style":217},[1140],{"type":57,"value":1141},"                                              # list AVDs\n",{"type":52,"tag":121,"props":1143,"children":1144},{"class":123,"line":192},[1145],{"type":52,"tag":121,"props":1146,"children":1147},{"emptyLinePlaceholder":994},[1148],{"type":57,"value":997},{"type":52,"tag":121,"props":1150,"children":1151},{"class":123,"line":223},[1152],{"type":52,"tag":121,"props":1153,"children":1154},{"style":217},[1155],{"type":57,"value":1156},"# Create a project-dedicated emulator to avoid conflicts\n",{"type":52,"tag":121,"props":1158,"children":1159},{"class":123,"line":1008},[1160,1164,1168,1172,1177,1181,1186,1190],{"type":52,"tag":121,"props":1161,"children":1162},{"style":128},[1163],{"type":57,"value":32},{"type":52,"tag":121,"props":1165,"children":1166},{"style":133},[1167],{"type":57,"value":1132},{"type":52,"tag":121,"props":1169,"children":1170},{"style":133},[1171],{"type":57,"value":1022},{"type":52,"tag":121,"props":1173,"children":1174},{"style":133},[1175],{"type":57,"value":1176}," --name",{"type":52,"tag":121,"props":1178,"children":1179},{"style":159},[1180],{"type":57,"value":546},{"type":52,"tag":121,"props":1182,"children":1183},{"style":133},[1184],{"type":57,"value":1185},"MyApp-Pixel8",{"type":52,"tag":121,"props":1187,"children":1188},{"style":159},[1189],{"type":57,"value":556},{"type":52,"tag":121,"props":1191,"children":1192},{"style":1092},[1193],{"type":57,"value":1194}," \\\n",{"type":52,"tag":121,"props":1196,"children":1197},{"class":123,"line":1065},[1198,1203,1207,1212,1216,1221],{"type":52,"tag":121,"props":1199,"children":1200},{"style":133},[1201],{"type":57,"value":1202},"  --sdk",{"type":52,"tag":121,"props":1204,"children":1205},{"style":159},[1206],{"type":57,"value":546},{"type":52,"tag":121,"props":1208,"children":1209},{"style":133},[1210],{"type":57,"value":1211},"system-images;android-35;google_apis;arm64-v8a",{"type":52,"tag":121,"props":1213,"children":1214},{"style":159},[1215],{"type":57,"value":556},{"type":52,"tag":121,"props":1217,"children":1218},{"style":133},[1219],{"type":57,"value":1220}," --device",{"type":52,"tag":121,"props":1222,"children":1223},{"style":133},[1224],{"type":57,"value":1225}," pixel_8\n",{"type":52,"tag":121,"props":1227,"children":1229},{"class":123,"line":1228},6,[1230,1234,1238,1243,1247,1251,1255],{"type":52,"tag":121,"props":1231,"children":1232},{"style":128},[1233],{"type":57,"value":32},{"type":52,"tag":121,"props":1235,"children":1236},{"style":133},[1237],{"type":57,"value":1132},{"type":52,"tag":121,"props":1239,"children":1240},{"style":133},[1241],{"type":57,"value":1242}," start",{"type":52,"tag":121,"props":1244,"children":1245},{"style":133},[1246],{"type":57,"value":1176},{"type":52,"tag":121,"props":1248,"children":1249},{"style":159},[1250],{"type":57,"value":546},{"type":52,"tag":121,"props":1252,"children":1253},{"style":133},[1254],{"type":57,"value":1185},{"type":52,"tag":121,"props":1256,"children":1257},{"style":159},[1258],{"type":57,"value":1062},{"type":52,"tag":60,"props":1260,"children":1261},{},[1262,1267],{"type":52,"tag":96,"props":1263,"children":1264},{},[1265],{"type":57,"value":1266},"Mac Catalyst \u002F macOS (AppKit) \u002F Linux\u002FGTK:",{"type":57,"value":1268}," No device setup needed — runs as desktop app.\nMultiple desktop apps can run simultaneously without conflicts.",{"type":52,"tag":495,"props":1270,"children":1272},{"id":1271},"_2-detect-the-tfm",[1273],{"type":57,"value":1274},"2. Detect the TFM",{"type":52,"tag":60,"props":1276,"children":1277},{},[1278,1283,1285,1291,1293,1299,1301,1307],{"type":52,"tag":96,"props":1279,"children":1280},{},[1281],{"type":57,"value":1282},"IMPORTANT:",{"type":57,"value":1284}," Before building, detect the correct Target Framework Moniker from the project.\nDo NOT assume ",{"type":52,"tag":66,"props":1286,"children":1288},{"className":1287},[],[1289],{"type":57,"value":1290},"net10.0",{"type":57,"value":1292}," — many projects use ",{"type":52,"tag":66,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":57,"value":1298},"net9.0",{"type":57,"value":1300},", ",{"type":52,"tag":66,"props":1302,"children":1304},{"className":1303},[],[1305],{"type":57,"value":1306},"net8.0",{"type":57,"value":1308},", etc.",{"type":52,"tag":110,"props":1310,"children":1312},{"className":112,"code":1311,"language":114,"meta":115,"style":115},"grep -i 'TargetFrameworks' *.csproj Directory.Build.props 2>\u002Fdev\u002Fnull\n",[1313],{"type":52,"tag":66,"props":1314,"children":1315},{"__ignoreMap":115},[1316],{"type":52,"tag":121,"props":1317,"children":1318},{"class":123,"line":124},[1319,1323,1328,1333,1338,1343,1348,1353,1358,1363],{"type":52,"tag":121,"props":1320,"children":1321},{"style":128},[1322],{"type":57,"value":536},{"type":52,"tag":121,"props":1324,"children":1325},{"style":133},[1326],{"type":57,"value":1327}," -i",{"type":52,"tag":121,"props":1329,"children":1330},{"style":159},[1331],{"type":57,"value":1332}," '",{"type":52,"tag":121,"props":1334,"children":1335},{"style":133},[1336],{"type":57,"value":1337},"TargetFrameworks",{"type":52,"tag":121,"props":1339,"children":1340},{"style":159},[1341],{"type":57,"value":1342},"'",{"type":52,"tag":121,"props":1344,"children":1345},{"style":1092},[1346],{"type":57,"value":1347}," *",{"type":52,"tag":121,"props":1349,"children":1350},{"style":133},[1351],{"type":57,"value":1352},".csproj",{"type":52,"tag":121,"props":1354,"children":1355},{"style":133},[1356],{"type":57,"value":1357}," Directory.Build.props",{"type":52,"tag":121,"props":1359,"children":1360},{"style":159},[1361],{"type":57,"value":1362}," 2>",{"type":52,"tag":121,"props":1364,"children":1365},{"style":133},[1366],{"type":57,"value":1367},"\u002Fdev\u002Fnull\n",{"type":52,"tag":60,"props":1369,"children":1370},{},[1371,1373,1378,1380,1386],{"type":57,"value":1372},"Use the detected version (e.g. ",{"type":52,"tag":66,"props":1374,"children":1376},{"className":1375},[],[1377],{"type":57,"value":1298},{"type":57,"value":1379},") in all build commands. The examples use ",{"type":52,"tag":66,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":57,"value":1385},"$TFM",{"type":57,"value":89},{"type":52,"tag":495,"props":1388,"children":1390},{"id":1389},"_3-build-deploy-and-connect",[1391],{"type":57,"value":1392},"3. Build, Deploy, and Connect",{"type":52,"tag":60,"props":1394,"children":1395},{},[1396],{"type":57,"value":1397},"Follow these steps for every launch and rebuild.",{"type":52,"tag":60,"props":1399,"children":1400},{},[1401,1406,1408,1413],{"type":52,"tag":96,"props":1402,"children":1403},{},[1404],{"type":57,"value":1405},"Step 1: Kill any previous instance",{"type":57,"value":1407}," (skip on first launch).\nA stale app's agent stays registered with the broker, causing ",{"type":52,"tag":66,"props":1409,"children":1411},{"className":1410},[],[1412],{"type":57,"value":765},{"type":57,"value":1414}," to return\nthe old port instantly instead of waiting for the new build.",{"type":52,"tag":110,"props":1416,"children":1418},{"className":112,"code":1417,"language":114,"meta":115,"style":115},"# Stop the async shell from the previous launch, then confirm:\nmaui devflow list                 # should show no agents (or only unrelated ones)\n",[1419],{"type":52,"tag":66,"props":1420,"children":1421},{"__ignoreMap":115},[1422,1430],{"type":52,"tag":121,"props":1423,"children":1424},{"class":123,"line":124},[1425],{"type":52,"tag":121,"props":1426,"children":1427},{"style":217},[1428],{"type":57,"value":1429},"# Stop the async shell from the previous launch, then confirm:\n",{"type":52,"tag":121,"props":1431,"children":1432},{"class":123,"line":192},[1433,1437,1441,1445],{"type":52,"tag":121,"props":1434,"children":1435},{"style":128},[1436],{"type":57,"value":14},{"type":52,"tag":121,"props":1438,"children":1439},{"style":133},[1440],{"type":57,"value":619},{"type":52,"tag":121,"props":1442,"children":1443},{"style":133},[1444],{"type":57,"value":624},{"type":52,"tag":121,"props":1446,"children":1447},{"style":217},[1448],{"type":57,"value":1449},"                 # should show no agents (or only unrelated ones)\n",{"type":52,"tag":60,"props":1451,"children":1452},{},[1453],{"type":52,"tag":96,"props":1454,"children":1455},{},[1456],{"type":57,"value":1457},"Step 2: Launch in an async shell.",{"type":52,"tag":110,"props":1459,"children":1461},{"className":112,"code":1460,"language":114,"meta":115,"style":115},"# iOS Simulator\ndotnet build -f $TFM-ios -t:Run -p:_DeviceName=:v2:udid=\u003CUDID>\n\n# Android Emulator\ndotnet build -f $TFM-android -t:Run\n\n# Mac Catalyst\ndotnet build -f $TFM-maccatalyst -t:Run\n\n# macOS AppKit — build exits after compiling; launch separately\ndotnet build -f $TFM-macos \u003Cpath-to-macos-project>\nopen path\u002Fto\u002Fbin\u002FDebug\u002F$TFM-macos\u002Fosx-arm64\u002FAppName.app\n\n# Linux\u002FGTK\ndotnet run --project \u003Cpath-to-gtk-project>\n",[1462],{"type":52,"tag":66,"props":1463,"children":1464},{"__ignoreMap":115},[1465,1473,1525,1532,1540,1569,1576,1585,1614,1622,1631,1674,1697,1705,1714],{"type":52,"tag":121,"props":1466,"children":1467},{"class":123,"line":124},[1468],{"type":52,"tag":121,"props":1469,"children":1470},{"style":217},[1471],{"type":57,"value":1472},"# iOS Simulator\n",{"type":52,"tag":121,"props":1474,"children":1475},{"class":123,"line":192},[1476,1480,1485,1490,1495,1500,1505,1510,1515,1520],{"type":52,"tag":121,"props":1477,"children":1478},{"style":128},[1479],{"type":57,"value":8},{"type":52,"tag":121,"props":1481,"children":1482},{"style":133},[1483],{"type":57,"value":1484}," build",{"type":52,"tag":121,"props":1486,"children":1487},{"style":133},[1488],{"type":57,"value":1489}," -f",{"type":52,"tag":121,"props":1491,"children":1492},{"style":1092},[1493],{"type":57,"value":1494}," $TFM",{"type":52,"tag":121,"props":1496,"children":1497},{"style":133},[1498],{"type":57,"value":1499},"-ios",{"type":52,"tag":121,"props":1501,"children":1502},{"style":133},[1503],{"type":57,"value":1504}," -t:Run",{"type":52,"tag":121,"props":1506,"children":1507},{"style":133},[1508],{"type":57,"value":1509}," -p:_DeviceName=:v2:udid=",{"type":52,"tag":121,"props":1511,"children":1512},{"style":159},[1513],{"type":57,"value":1514},"\u003C",{"type":52,"tag":121,"props":1516,"children":1517},{"style":133},[1518],{"type":57,"value":1519},"UDID",{"type":52,"tag":121,"props":1521,"children":1522},{"style":159},[1523],{"type":57,"value":1524},">\n",{"type":52,"tag":121,"props":1526,"children":1527},{"class":123,"line":223},[1528],{"type":52,"tag":121,"props":1529,"children":1530},{"emptyLinePlaceholder":994},[1531],{"type":57,"value":997},{"type":52,"tag":121,"props":1533,"children":1534},{"class":123,"line":1008},[1535],{"type":52,"tag":121,"props":1536,"children":1537},{"style":217},[1538],{"type":57,"value":1539},"# Android Emulator\n",{"type":52,"tag":121,"props":1541,"children":1542},{"class":123,"line":1065},[1543,1547,1551,1555,1559,1564],{"type":52,"tag":121,"props":1544,"children":1545},{"style":128},[1546],{"type":57,"value":8},{"type":52,"tag":121,"props":1548,"children":1549},{"style":133},[1550],{"type":57,"value":1484},{"type":52,"tag":121,"props":1552,"children":1553},{"style":133},[1554],{"type":57,"value":1489},{"type":52,"tag":121,"props":1556,"children":1557},{"style":1092},[1558],{"type":57,"value":1494},{"type":52,"tag":121,"props":1560,"children":1561},{"style":133},[1562],{"type":57,"value":1563},"-android",{"type":52,"tag":121,"props":1565,"children":1566},{"style":133},[1567],{"type":57,"value":1568}," -t:Run\n",{"type":52,"tag":121,"props":1570,"children":1571},{"class":123,"line":1228},[1572],{"type":52,"tag":121,"props":1573,"children":1574},{"emptyLinePlaceholder":994},[1575],{"type":57,"value":997},{"type":52,"tag":121,"props":1577,"children":1579},{"class":123,"line":1578},7,[1580],{"type":52,"tag":121,"props":1581,"children":1582},{"style":217},[1583],{"type":57,"value":1584},"# Mac Catalyst\n",{"type":52,"tag":121,"props":1586,"children":1588},{"class":123,"line":1587},8,[1589,1593,1597,1601,1605,1610],{"type":52,"tag":121,"props":1590,"children":1591},{"style":128},[1592],{"type":57,"value":8},{"type":52,"tag":121,"props":1594,"children":1595},{"style":133},[1596],{"type":57,"value":1484},{"type":52,"tag":121,"props":1598,"children":1599},{"style":133},[1600],{"type":57,"value":1489},{"type":52,"tag":121,"props":1602,"children":1603},{"style":1092},[1604],{"type":57,"value":1494},{"type":52,"tag":121,"props":1606,"children":1607},{"style":133},[1608],{"type":57,"value":1609},"-maccatalyst",{"type":52,"tag":121,"props":1611,"children":1612},{"style":133},[1613],{"type":57,"value":1568},{"type":52,"tag":121,"props":1615,"children":1617},{"class":123,"line":1616},9,[1618],{"type":52,"tag":121,"props":1619,"children":1620},{"emptyLinePlaceholder":994},[1621],{"type":57,"value":997},{"type":52,"tag":121,"props":1623,"children":1625},{"class":123,"line":1624},10,[1626],{"type":52,"tag":121,"props":1627,"children":1628},{"style":217},[1629],{"type":57,"value":1630},"# macOS AppKit — build exits after compiling; launch separately\n",{"type":52,"tag":121,"props":1632,"children":1634},{"class":123,"line":1633},11,[1635,1639,1643,1647,1651,1656,1660,1665,1670],{"type":52,"tag":121,"props":1636,"children":1637},{"style":128},[1638],{"type":57,"value":8},{"type":52,"tag":121,"props":1640,"children":1641},{"style":133},[1642],{"type":57,"value":1484},{"type":52,"tag":121,"props":1644,"children":1645},{"style":133},[1646],{"type":57,"value":1489},{"type":52,"tag":121,"props":1648,"children":1649},{"style":1092},[1650],{"type":57,"value":1494},{"type":52,"tag":121,"props":1652,"children":1653},{"style":133},[1654],{"type":57,"value":1655},"-macos",{"type":52,"tag":121,"props":1657,"children":1658},{"style":159},[1659],{"type":57,"value":1084},{"type":52,"tag":121,"props":1661,"children":1662},{"style":133},[1663],{"type":57,"value":1664},"path-to-macos-projec",{"type":52,"tag":121,"props":1666,"children":1667},{"style":1092},[1668],{"type":57,"value":1669},"t",{"type":52,"tag":121,"props":1671,"children":1672},{"style":159},[1673],{"type":57,"value":1524},{"type":52,"tag":121,"props":1675,"children":1677},{"class":123,"line":1676},12,[1678,1683,1688,1692],{"type":52,"tag":121,"props":1679,"children":1680},{"style":128},[1681],{"type":57,"value":1682},"open",{"type":52,"tag":121,"props":1684,"children":1685},{"style":133},[1686],{"type":57,"value":1687}," path\u002Fto\u002Fbin\u002FDebug\u002F",{"type":52,"tag":121,"props":1689,"children":1690},{"style":1092},[1691],{"type":57,"value":1385},{"type":52,"tag":121,"props":1693,"children":1694},{"style":133},[1695],{"type":57,"value":1696},"-macos\u002Fosx-arm64\u002FAppName.app\n",{"type":52,"tag":121,"props":1698,"children":1700},{"class":123,"line":1699},13,[1701],{"type":52,"tag":121,"props":1702,"children":1703},{"emptyLinePlaceholder":994},[1704],{"type":57,"value":997},{"type":52,"tag":121,"props":1706,"children":1708},{"class":123,"line":1707},14,[1709],{"type":52,"tag":121,"props":1710,"children":1711},{"style":217},[1712],{"type":57,"value":1713},"# Linux\u002FGTK\n",{"type":52,"tag":121,"props":1715,"children":1717},{"class":123,"line":1716},15,[1718,1722,1727,1731,1735,1740,1744],{"type":52,"tag":121,"props":1719,"children":1720},{"style":128},[1721],{"type":57,"value":8},{"type":52,"tag":121,"props":1723,"children":1724},{"style":133},[1725],{"type":57,"value":1726}," run",{"type":52,"tag":121,"props":1728,"children":1729},{"style":133},[1730],{"type":57,"value":863},{"type":52,"tag":121,"props":1732,"children":1733},{"style":159},[1734],{"type":57,"value":1084},{"type":52,"tag":121,"props":1736,"children":1737},{"style":133},[1738],{"type":57,"value":1739},"path-to-gtk-projec",{"type":52,"tag":121,"props":1741,"children":1742},{"style":1092},[1743],{"type":57,"value":1669},{"type":52,"tag":121,"props":1745,"children":1746},{"style":159},[1747],{"type":57,"value":1524},{"type":52,"tag":60,"props":1749,"children":1750},{},[1751],{"type":52,"tag":96,"props":1752,"children":1753},{},[1754],{"type":57,"value":1755},"⚠️ Process lifecycle rules:",{"type":52,"tag":343,"props":1757,"children":1758},{},[1759,1807],{"type":52,"tag":321,"props":1760,"children":1761},{},[1762,1767,1769,1775,1777,1782,1784,1789,1791,1797,1799,1805],{"type":52,"tag":66,"props":1763,"children":1765},{"className":1764},[],[1766],{"type":57,"value":813},{"type":57,"value":1768}," (iOS, Android, Mac Catalyst) and ",{"type":52,"tag":66,"props":1770,"children":1772},{"className":1771},[],[1773],{"type":57,"value":1774},"dotnet run",{"type":57,"value":1776}," (Linux\u002FGTK) ",{"type":52,"tag":96,"props":1778,"children":1779},{},[1780],{"type":57,"value":1781},"block\nfor the lifetime of the app",{"type":57,"value":1783},". Killing or stopping the shell ",{"type":52,"tag":96,"props":1785,"children":1786},{},[1787],{"type":57,"value":1788},"kills the app",{"type":57,"value":1790},". Use\n",{"type":52,"tag":66,"props":1792,"children":1794},{"className":1793},[],[1795],{"type":57,"value":1796},"mode: \"async\"",{"type":57,"value":1798}," with ",{"type":52,"tag":66,"props":1800,"children":1802},{"className":1801},[],[1803],{"type":57,"value":1804},"initial_wait: 120",{"type":57,"value":1806}," and do NOT stop the shell until you are done.",{"type":52,"tag":321,"props":1808,"children":1809},{},[1810,1815,1817,1823,1825,1830],{"type":52,"tag":96,"props":1811,"children":1812},{},[1813],{"type":57,"value":1814},"macOS (AppKit)",{"type":57,"value":1816}," is the exception: ",{"type":52,"tag":66,"props":1818,"children":1820},{"className":1819},[],[1821],{"type":57,"value":1822},"dotnet build",{"type":57,"value":1824}," exits after compiling, and ",{"type":52,"tag":66,"props":1826,"children":1828},{"className":1827},[],[1829],{"type":57,"value":1682},{"type":57,"value":1831},"\nlaunches the app independently — the app survives shell termination.",{"type":52,"tag":60,"props":1833,"children":1834},{},[1835,1840,1842,1848],{"type":52,"tag":96,"props":1836,"children":1837},{},[1838],{"type":57,"value":1839},"Step 3: Wait for the agent",{"type":57,"value":1841}," — never use ",{"type":52,"tag":66,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":57,"value":1847},"sleep",{"type":57,"value":89},{"type":52,"tag":110,"props":1850,"children":1852},{"className":112,"code":1851,"language":114,"meta":115,"style":115},"maui devflow wait                                # blocks until agent registers (default 120s)\nmaui devflow wait --project path\u002Fto\u002FApp.csproj   # filter to specific project\n",[1853],{"type":52,"tag":66,"props":1854,"children":1855},{"__ignoreMap":115},[1856,1876],{"type":52,"tag":121,"props":1857,"children":1858},{"class":123,"line":124},[1859,1863,1867,1871],{"type":52,"tag":121,"props":1860,"children":1861},{"style":128},[1862],{"type":57,"value":14},{"type":52,"tag":121,"props":1864,"children":1865},{"style":133},[1866],{"type":57,"value":619},{"type":52,"tag":121,"props":1868,"children":1869},{"style":133},[1870],{"type":57,"value":838},{"type":52,"tag":121,"props":1872,"children":1873},{"style":217},[1874],{"type":57,"value":1875},"                                # blocks until agent registers (default 120s)\n",{"type":52,"tag":121,"props":1877,"children":1878},{"class":123,"line":192},[1879,1883,1887,1891,1895,1899],{"type":52,"tag":121,"props":1880,"children":1881},{"style":128},[1882],{"type":57,"value":14},{"type":52,"tag":121,"props":1884,"children":1885},{"style":133},[1886],{"type":57,"value":619},{"type":52,"tag":121,"props":1888,"children":1889},{"style":133},[1890],{"type":57,"value":838},{"type":52,"tag":121,"props":1892,"children":1893},{"style":133},[1894],{"type":57,"value":863},{"type":52,"tag":121,"props":1896,"children":1897},{"style":133},[1898],{"type":57,"value":868},{"type":52,"tag":121,"props":1900,"children":1901},{"style":217},[1902],{"type":57,"value":1903},"   # filter to specific project\n",{"type":52,"tag":60,"props":1905,"children":1906},{},[1907,1912,1914,1919,1921,1927],{"type":52,"tag":66,"props":1908,"children":1910},{"className":1909},[],[1911],{"type":57,"value":765},{"type":57,"value":1913}," prints the assigned port as soon as the agent connects. Exit code 1\nmeans timeout. If ",{"type":52,"tag":66,"props":1915,"children":1917},{"className":1916},[],[1918],{"type":57,"value":884},{"type":57,"value":1920}," times out, run ",{"type":52,"tag":66,"props":1922,"children":1924},{"className":1923},[],[1925],{"type":57,"value":1926},"maui devflow diagnose",{"type":57,"value":1928}," to identify the issue.\nCheck async shell output for build errors.",{"type":52,"tag":60,"props":1930,"children":1931},{},[1932,1937],{"type":52,"tag":96,"props":1933,"children":1934},{},[1935],{"type":57,"value":1936},"Android only",{"type":57,"value":1938}," — set up port forwarding after the agent connects:",{"type":52,"tag":110,"props":1940,"children":1942},{"className":112,"code":1941,"language":114,"meta":115,"style":115},"adb reverse tcp:19223 tcp:19223   # Broker (lets agent in emulator reach host broker)\nadb forward tcp:\u003Cport> tcp:\u003Cport> # Agent (lets CLI reach agent in emulator)\n",[1943],{"type":52,"tag":66,"props":1944,"children":1945},{"__ignoreMap":115},[1946,1973],{"type":52,"tag":121,"props":1947,"children":1948},{"class":123,"line":124},[1949,1954,1959,1964,1968],{"type":52,"tag":121,"props":1950,"children":1951},{"style":128},[1952],{"type":57,"value":1953},"adb",{"type":52,"tag":121,"props":1955,"children":1956},{"style":133},[1957],{"type":57,"value":1958}," reverse",{"type":52,"tag":121,"props":1960,"children":1961},{"style":133},[1962],{"type":57,"value":1963}," tcp:19223",{"type":52,"tag":121,"props":1965,"children":1966},{"style":133},[1967],{"type":57,"value":1963},{"type":52,"tag":121,"props":1969,"children":1970},{"style":217},[1971],{"type":57,"value":1972},"   # Broker (lets agent in emulator reach host broker)\n",{"type":52,"tag":121,"props":1974,"children":1975},{"class":123,"line":192},[1976,1980,1985,1990,1994,1999,2003,2007,2011,2015,2019,2023,2027],{"type":52,"tag":121,"props":1977,"children":1978},{"style":128},[1979],{"type":57,"value":1953},{"type":52,"tag":121,"props":1981,"children":1982},{"style":133},[1983],{"type":57,"value":1984}," forward",{"type":52,"tag":121,"props":1986,"children":1987},{"style":133},[1988],{"type":57,"value":1989}," tcp:",{"type":52,"tag":121,"props":1991,"children":1992},{"style":159},[1993],{"type":57,"value":1514},{"type":52,"tag":121,"props":1995,"children":1996},{"style":133},[1997],{"type":57,"value":1998},"por",{"type":52,"tag":121,"props":2000,"children":2001},{"style":1092},[2002],{"type":57,"value":1669},{"type":52,"tag":121,"props":2004,"children":2005},{"style":159},[2006],{"type":57,"value":1100},{"type":52,"tag":121,"props":2008,"children":2009},{"style":133},[2010],{"type":57,"value":1989},{"type":52,"tag":121,"props":2012,"children":2013},{"style":159},[2014],{"type":57,"value":1514},{"type":52,"tag":121,"props":2016,"children":2017},{"style":133},[2018],{"type":57,"value":1998},{"type":52,"tag":121,"props":2020,"children":2021},{"style":1092},[2022],{"type":57,"value":1669},{"type":52,"tag":121,"props":2024,"children":2025},{"style":159},[2026],{"type":57,"value":1100},{"type":52,"tag":121,"props":2028,"children":2029},{"style":217},[2030],{"type":57,"value":2031}," # Agent (lets CLI reach agent in emulator)\n",{"type":52,"tag":60,"props":2033,"children":2034},{},[2035,2040,2042,2047],{"type":52,"tag":96,"props":2036,"children":2037},{},[2038],{"type":57,"value":2039},"To rebuild:",{"type":57,"value":2041}," repeat from Step 1. See ",{"type":52,"tag":302,"props":2043,"children":2045},{"href":2044},"references\u002Ftroubleshooting.md",[2046],{"type":57,"value":2044},{"type":57,"value":2048},"\nif the build fails.",{"type":52,"tag":495,"props":2050,"children":2052},{"id":2051},"_4-inspect-and-interact",[2053],{"type":57,"value":2054},"4. Inspect and Interact",{"type":52,"tag":60,"props":2056,"children":2057},{},[2058],{"type":52,"tag":96,"props":2059,"children":2060},{},[2061],{"type":57,"value":2062},"Typical inspection flow:",{"type":52,"tag":317,"props":2064,"children":2065},{},[2066,2077,2088,2099,2110,2121,2132,2143,2154],{"type":52,"tag":321,"props":2067,"children":2068},{},[2069,2075],{"type":52,"tag":66,"props":2070,"children":2072},{"className":2071},[],[2073],{"type":57,"value":2074},"maui devflow ui tree --depth 15 --fields \"id,type,text,automationId\"",{"type":57,"value":2076}," — tree with key fields only (depth 15 reaches most controls)",{"type":52,"tag":321,"props":2078,"children":2079},{},[2080,2086],{"type":52,"tag":66,"props":2081,"children":2083},{"className":2082},[],[2084],{"type":57,"value":2085},"maui devflow ui tree --window 1",{"type":57,"value":2087}," — filter to a specific window (0-based index)",{"type":52,"tag":321,"props":2089,"children":2090},{},[2091,2097],{"type":52,"tag":66,"props":2092,"children":2094},{"className":2093},[],[2095],{"type":57,"value":2096},"maui devflow ui query --automationId \"MyButton\"",{"type":57,"value":2098}," — find specific elements",{"type":52,"tag":321,"props":2100,"children":2101},{},[2102,2108],{"type":52,"tag":66,"props":2103,"children":2105},{"className":2104},[],[2106],{"type":57,"value":2107},"maui devflow ui query --type Entry --fields \"id,text,automationId\"",{"type":57,"value":2109}," — all Entry fields with specific fields",{"type":52,"tag":321,"props":2111,"children":2112},{},[2113,2119],{"type":52,"tag":66,"props":2114,"children":2116},{"className":2115},[],[2117],{"type":57,"value":2118},"maui devflow ui element \u003Cid>",{"type":57,"value":2120}," — get full details (type, bounds, visibility, children)",{"type":52,"tag":321,"props":2122,"children":2123},{},[2124,2130],{"type":52,"tag":66,"props":2125,"children":2127},{"className":2126},[],[2128],{"type":57,"value":2129},"maui devflow ui property \u003Cid> Text",{"type":57,"value":2131}," — read any property by name",{"type":52,"tag":321,"props":2133,"children":2134},{},[2135,2141],{"type":52,"tag":66,"props":2136,"children":2138},{"className":2137},[],[2139],{"type":57,"value":2140},"maui devflow ui screenshot --output screen.png",{"type":57,"value":2142}," — visual verification (auto-scaled to 1x on HiDPI)",{"type":52,"tag":321,"props":2144,"children":2145},{},[2146,2152],{"type":52,"tag":66,"props":2147,"children":2149},{"className":2148},[],[2150],{"type":57,"value":2151},"maui devflow ui screenshot --id \u003CelementId> --output el.png",{"type":57,"value":2153}," — element-only screenshot",{"type":52,"tag":321,"props":2155,"children":2156},{},[2157,2163],{"type":52,"tag":66,"props":2158,"children":2160},{"className":2159},[],[2161],{"type":57,"value":2162},"maui devflow ui screenshot --selector \"Button\" --output btn.png",{"type":57,"value":2164}," — screenshot by CSS selector",{"type":52,"tag":60,"props":2166,"children":2167},{},[2168,2173],{"type":52,"tag":96,"props":2169,"children":2170},{},[2171],{"type":57,"value":2172},"Property inspection",{"type":57,"value":2174}," is more reliable than screenshots for verifying exact runtime values:",{"type":52,"tag":110,"props":2176,"children":2178},{"className":112,"code":2177,"language":114,"meta":115,"style":115},"maui devflow ui property \u003Cid> BackgroundColor    # verify dark mode colors\nmaui devflow ui property \u003Cid> IsVisible          # check element visibility\n",[2179],{"type":52,"tag":66,"props":2180,"children":2181},{"__ignoreMap":115},[2182,2231],{"type":52,"tag":121,"props":2183,"children":2184},{"class":123,"line":124},[2185,2189,2193,2198,2203,2207,2212,2217,2221,2226],{"type":52,"tag":121,"props":2186,"children":2187},{"style":128},[2188],{"type":57,"value":14},{"type":52,"tag":121,"props":2190,"children":2191},{"style":133},[2192],{"type":57,"value":619},{"type":52,"tag":121,"props":2194,"children":2195},{"style":133},[2196],{"type":57,"value":2197}," ui",{"type":52,"tag":121,"props":2199,"children":2200},{"style":133},[2201],{"type":57,"value":2202}," property",{"type":52,"tag":121,"props":2204,"children":2205},{"style":159},[2206],{"type":57,"value":1084},{"type":52,"tag":121,"props":2208,"children":2209},{"style":133},[2210],{"type":57,"value":2211},"i",{"type":52,"tag":121,"props":2213,"children":2214},{"style":1092},[2215],{"type":57,"value":2216},"d",{"type":52,"tag":121,"props":2218,"children":2219},{"style":159},[2220],{"type":57,"value":1100},{"type":52,"tag":121,"props":2222,"children":2223},{"style":133},[2224],{"type":57,"value":2225}," BackgroundColor",{"type":52,"tag":121,"props":2227,"children":2228},{"style":217},[2229],{"type":57,"value":2230},"    # verify dark mode colors\n",{"type":52,"tag":121,"props":2232,"children":2233},{"class":123,"line":192},[2234,2238,2242,2246,2250,2254,2258,2262,2266,2271],{"type":52,"tag":121,"props":2235,"children":2236},{"style":128},[2237],{"type":57,"value":14},{"type":52,"tag":121,"props":2239,"children":2240},{"style":133},[2241],{"type":57,"value":619},{"type":52,"tag":121,"props":2243,"children":2244},{"style":133},[2245],{"type":57,"value":2197},{"type":52,"tag":121,"props":2247,"children":2248},{"style":133},[2249],{"type":57,"value":2202},{"type":52,"tag":121,"props":2251,"children":2252},{"style":159},[2253],{"type":57,"value":1084},{"type":52,"tag":121,"props":2255,"children":2256},{"style":133},[2257],{"type":57,"value":2211},{"type":52,"tag":121,"props":2259,"children":2260},{"style":1092},[2261],{"type":57,"value":2216},{"type":52,"tag":121,"props":2263,"children":2264},{"style":159},[2265],{"type":57,"value":1100},{"type":52,"tag":121,"props":2267,"children":2268},{"style":133},[2269],{"type":57,"value":2270}," IsVisible",{"type":52,"tag":121,"props":2272,"children":2273},{"style":217},[2274],{"type":57,"value":2275},"          # check element visibility\n",{"type":52,"tag":60,"props":2277,"children":2278},{},[2279],{"type":52,"tag":96,"props":2280,"children":2281},{},[2282],{"type":57,"value":2283},"Live editing (no rebuild needed):",{"type":52,"tag":110,"props":2285,"children":2287},{"className":112,"code":2286,"language":114,"meta":115,"style":115},"maui devflow ui set-property \u003Cid> TextColor \"Tomato\"\nmaui devflow ui set-property \u003Cid> FontSize \"24\"\n",[2288],{"type":52,"tag":66,"props":2289,"children":2290},{"__ignoreMap":115},[2291,2345],{"type":52,"tag":121,"props":2292,"children":2293},{"class":123,"line":124},[2294,2298,2302,2306,2311,2315,2319,2323,2327,2332,2336,2341],{"type":52,"tag":121,"props":2295,"children":2296},{"style":128},[2297],{"type":57,"value":14},{"type":52,"tag":121,"props":2299,"children":2300},{"style":133},[2301],{"type":57,"value":619},{"type":52,"tag":121,"props":2303,"children":2304},{"style":133},[2305],{"type":57,"value":2197},{"type":52,"tag":121,"props":2307,"children":2308},{"style":133},[2309],{"type":57,"value":2310}," set-property",{"type":52,"tag":121,"props":2312,"children":2313},{"style":159},[2314],{"type":57,"value":1084},{"type":52,"tag":121,"props":2316,"children":2317},{"style":133},[2318],{"type":57,"value":2211},{"type":52,"tag":121,"props":2320,"children":2321},{"style":1092},[2322],{"type":57,"value":2216},{"type":52,"tag":121,"props":2324,"children":2325},{"style":159},[2326],{"type":57,"value":1100},{"type":52,"tag":121,"props":2328,"children":2329},{"style":133},[2330],{"type":57,"value":2331}," TextColor",{"type":52,"tag":121,"props":2333,"children":2334},{"style":159},[2335],{"type":57,"value":546},{"type":52,"tag":121,"props":2337,"children":2338},{"style":133},[2339],{"type":57,"value":2340},"Tomato",{"type":52,"tag":121,"props":2342,"children":2343},{"style":159},[2344],{"type":57,"value":1062},{"type":52,"tag":121,"props":2346,"children":2347},{"class":123,"line":192},[2348,2352,2356,2360,2364,2368,2372,2376,2380,2385,2389,2394],{"type":52,"tag":121,"props":2349,"children":2350},{"style":128},[2351],{"type":57,"value":14},{"type":52,"tag":121,"props":2353,"children":2354},{"style":133},[2355],{"type":57,"value":619},{"type":52,"tag":121,"props":2357,"children":2358},{"style":133},[2359],{"type":57,"value":2197},{"type":52,"tag":121,"props":2361,"children":2362},{"style":133},[2363],{"type":57,"value":2310},{"type":52,"tag":121,"props":2365,"children":2366},{"style":159},[2367],{"type":57,"value":1084},{"type":52,"tag":121,"props":2369,"children":2370},{"style":133},[2371],{"type":57,"value":2211},{"type":52,"tag":121,"props":2373,"children":2374},{"style":1092},[2375],{"type":57,"value":2216},{"type":52,"tag":121,"props":2377,"children":2378},{"style":159},[2379],{"type":57,"value":1100},{"type":52,"tag":121,"props":2381,"children":2382},{"style":133},[2383],{"type":57,"value":2384}," FontSize",{"type":52,"tag":121,"props":2386,"children":2387},{"style":159},[2388],{"type":57,"value":546},{"type":52,"tag":121,"props":2390,"children":2391},{"style":133},[2392],{"type":57,"value":2393},"24",{"type":52,"tag":121,"props":2395,"children":2396},{"style":159},[2397],{"type":57,"value":1062},{"type":52,"tag":60,"props":2399,"children":2400},{},[2401],{"type":57,"value":2402},"Supports: string, bool, int, double, Color (named\u002Fhex), Thickness, enums. Changes persist\nuntil the app restarts — safe for experimentation.",{"type":52,"tag":60,"props":2404,"children":2405},{},[2406],{"type":52,"tag":96,"props":2407,"children":2408},{},[2409],{"type":57,"value":2410},"Typical interaction flow:",{"type":52,"tag":317,"props":2412,"children":2413},{},[2414,2425,2436,2447,2458],{"type":52,"tag":321,"props":2415,"children":2416},{},[2417,2423],{"type":52,"tag":66,"props":2418,"children":2420},{"className":2419},[],[2421],{"type":57,"value":2422},"maui devflow ui fill --automationId \"MyEntry\" \"text\"",{"type":57,"value":2424}," — type into Entry\u002FEditor fields (no query needed)",{"type":52,"tag":321,"props":2426,"children":2427},{},[2428,2434],{"type":52,"tag":66,"props":2429,"children":2431},{"className":2430},[],[2432],{"type":57,"value":2433},"maui devflow ui tap --automationId \"MyButton\"",{"type":57,"value":2435}," — tap buttons, checkboxes, list items",{"type":52,"tag":321,"props":2437,"children":2438},{},[2439,2445],{"type":52,"tag":66,"props":2440,"children":2442},{"className":2441},[],[2443],{"type":57,"value":2444},"maui devflow ui clear --automationId \"MyEntry\"",{"type":57,"value":2446}," — clear text fields",{"type":52,"tag":321,"props":2448,"children":2449},{},[2450,2452],{"type":57,"value":2451},"Or use element IDs from tree\u002Fquery: ",{"type":52,"tag":66,"props":2453,"children":2455},{"className":2454},[],[2456],{"type":57,"value":2457},"maui devflow ui tap \u003CelementId>",{"type":52,"tag":321,"props":2459,"children":2460},{},[2461,2463,2469],{"type":57,"value":2462},"Take screenshot to verify result, or use ",{"type":52,"tag":66,"props":2464,"children":2466},{"className":2465},[],[2467],{"type":57,"value":2468},"--and-screenshot",{"type":57,"value":2470}," on the action",{"type":52,"tag":60,"props":2472,"children":2473},{},[2474],{"type":52,"tag":96,"props":2475,"children":2476},{},[2477],{"type":57,"value":2478},"Blazor WebView (if applicable):",{"type":52,"tag":317,"props":2480,"children":2481},{},[2482,2493,2504,2515],{"type":52,"tag":321,"props":2483,"children":2484},{},[2485,2491],{"type":52,"tag":66,"props":2486,"children":2488},{"className":2487},[],[2489],{"type":57,"value":2490},"maui devflow webview snapshot",{"type":57,"value":2492}," — DOM tree as accessible text (best for AI)",{"type":52,"tag":321,"props":2494,"children":2495},{},[2496,2502],{"type":52,"tag":66,"props":2497,"children":2499},{"className":2498},[],[2500],{"type":57,"value":2501},"maui devflow webview Input fill \"css-selector\" \"text\"",{"type":57,"value":2503}," — fill inputs",{"type":52,"tag":321,"props":2505,"children":2506},{},[2507,2513],{"type":52,"tag":66,"props":2508,"children":2510},{"className":2509},[],[2511],{"type":57,"value":2512},"maui devflow webview Input dispatchClickEvent \"css-selector\"",{"type":57,"value":2514}," — click elements",{"type":52,"tag":321,"props":2516,"children":2517},{},[2518,2524],{"type":52,"tag":66,"props":2519,"children":2521},{"className":2520},[],[2522],{"type":57,"value":2523},"maui devflow webview Runtime evaluate \"js-expression\"",{"type":57,"value":2525}," — run JS",{"type":52,"tag":60,"props":2527,"children":2528},{},[2529,2534,2536,2542,2544,2550,2552,2558,2560,2566,2568,2574],{"type":52,"tag":96,"props":2530,"children":2531},{},[2532],{"type":57,"value":2533},"Multiple BlazorWebViews:",{"type":57,"value":2535}," If the app has more than one ",{"type":52,"tag":66,"props":2537,"children":2539},{"className":2538},[],[2540],{"type":57,"value":2541},"BlazorWebView",{"type":57,"value":2543},", each is\nregistered independently with its ",{"type":52,"tag":66,"props":2545,"children":2547},{"className":2546},[],[2548],{"type":57,"value":2549},"AutomationId",{"type":57,"value":2551},". Use ",{"type":52,"tag":66,"props":2553,"children":2555},{"className":2554},[],[2556],{"type":57,"value":2557},"webview webviews",{"type":57,"value":2559}," to list them,\nthen target a specific one with ",{"type":52,"tag":66,"props":2561,"children":2563},{"className":2562},[],[2564],{"type":57,"value":2565},"--webview",{"type":57,"value":2567}," (or ",{"type":52,"tag":66,"props":2569,"children":2571},{"className":2570},[],[2572],{"type":57,"value":2573},"-w",{"type":57,"value":2575},"):",{"type":52,"tag":110,"props":2577,"children":2579},{"className":112,"code":2578,"language":114,"meta":115,"style":115},"maui devflow webview webviews                                  # list all WebViews\nmaui devflow webview -w BlazorLeft snapshot                    # snapshot of a specific WebView\nmaui devflow webview -w 1 Runtime evaluate \"document.title\"    # target by index\n",[2580],{"type":52,"tag":66,"props":2581,"children":2582},{"__ignoreMap":115},[2583,2609,2644],{"type":52,"tag":121,"props":2584,"children":2585},{"class":123,"line":124},[2586,2590,2594,2599,2604],{"type":52,"tag":121,"props":2587,"children":2588},{"style":128},[2589],{"type":57,"value":14},{"type":52,"tag":121,"props":2591,"children":2592},{"style":133},[2593],{"type":57,"value":619},{"type":52,"tag":121,"props":2595,"children":2596},{"style":133},[2597],{"type":57,"value":2598}," webview",{"type":52,"tag":121,"props":2600,"children":2601},{"style":133},[2602],{"type":57,"value":2603}," webviews",{"type":52,"tag":121,"props":2605,"children":2606},{"style":217},[2607],{"type":57,"value":2608},"                                  # list all WebViews\n",{"type":52,"tag":121,"props":2610,"children":2611},{"class":123,"line":192},[2612,2616,2620,2624,2629,2634,2639],{"type":52,"tag":121,"props":2613,"children":2614},{"style":128},[2615],{"type":57,"value":14},{"type":52,"tag":121,"props":2617,"children":2618},{"style":133},[2619],{"type":57,"value":619},{"type":52,"tag":121,"props":2621,"children":2622},{"style":133},[2623],{"type":57,"value":2598},{"type":52,"tag":121,"props":2625,"children":2626},{"style":133},[2627],{"type":57,"value":2628}," -w",{"type":52,"tag":121,"props":2630,"children":2631},{"style":133},[2632],{"type":57,"value":2633}," BlazorLeft",{"type":52,"tag":121,"props":2635,"children":2636},{"style":133},[2637],{"type":57,"value":2638}," snapshot",{"type":52,"tag":121,"props":2640,"children":2641},{"style":217},[2642],{"type":57,"value":2643},"                    # snapshot of a specific WebView\n",{"type":52,"tag":121,"props":2645,"children":2646},{"class":123,"line":223},[2647,2651,2655,2659,2663,2669,2674,2679,2683,2688,2692],{"type":52,"tag":121,"props":2648,"children":2649},{"style":128},[2650],{"type":57,"value":14},{"type":52,"tag":121,"props":2652,"children":2653},{"style":133},[2654],{"type":57,"value":619},{"type":52,"tag":121,"props":2656,"children":2657},{"style":133},[2658],{"type":57,"value":2598},{"type":52,"tag":121,"props":2660,"children":2661},{"style":133},[2662],{"type":57,"value":2628},{"type":52,"tag":121,"props":2664,"children":2666},{"style":2665},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2667],{"type":57,"value":2668}," 1",{"type":52,"tag":121,"props":2670,"children":2671},{"style":133},[2672],{"type":57,"value":2673}," Runtime",{"type":52,"tag":121,"props":2675,"children":2676},{"style":133},[2677],{"type":57,"value":2678}," evaluate",{"type":52,"tag":121,"props":2680,"children":2681},{"style":159},[2682],{"type":57,"value":546},{"type":52,"tag":121,"props":2684,"children":2685},{"style":133},[2686],{"type":57,"value":2687},"document.title",{"type":52,"tag":121,"props":2689,"children":2690},{"style":159},[2691],{"type":57,"value":556},{"type":52,"tag":121,"props":2693,"children":2694},{"style":217},[2695],{"type":57,"value":2696},"    # target by index\n",{"type":52,"tag":60,"props":2698,"children":2699},{},[2700,2702,2707],{"type":57,"value":2701},"Without ",{"type":52,"tag":66,"props":2703,"children":2705},{"className":2704},[],[2706],{"type":57,"value":2565},{"type":57,"value":2708},", commands target the first (index 0) WebView.",{"type":52,"tag":60,"props":2710,"children":2711},{},[2712],{"type":52,"tag":96,"props":2713,"children":2714},{},[2715],{"type":57,"value":2716},"Live CSS\u002FDOM editing in Blazor (no rebuild needed):",{"type":52,"tag":110,"props":2718,"children":2720},{"className":112,"code":2719,"language":114,"meta":115,"style":115},"maui devflow webview Runtime evaluate \"document.querySelector('h1').style.color = 'tomato'\"\nmaui devflow webview Runtime evaluate \"document.documentElement.style.setProperty('--bg-color', '#1a1a2e')\"\n",[2721],{"type":52,"tag":66,"props":2722,"children":2723},{"__ignoreMap":115},[2724,2760],{"type":52,"tag":121,"props":2725,"children":2726},{"class":123,"line":124},[2727,2731,2735,2739,2743,2747,2751,2756],{"type":52,"tag":121,"props":2728,"children":2729},{"style":128},[2730],{"type":57,"value":14},{"type":52,"tag":121,"props":2732,"children":2733},{"style":133},[2734],{"type":57,"value":619},{"type":52,"tag":121,"props":2736,"children":2737},{"style":133},[2738],{"type":57,"value":2598},{"type":52,"tag":121,"props":2740,"children":2741},{"style":133},[2742],{"type":57,"value":2673},{"type":52,"tag":121,"props":2744,"children":2745},{"style":133},[2746],{"type":57,"value":2678},{"type":52,"tag":121,"props":2748,"children":2749},{"style":159},[2750],{"type":57,"value":546},{"type":52,"tag":121,"props":2752,"children":2753},{"style":133},[2754],{"type":57,"value":2755},"document.querySelector('h1').style.color = 'tomato'",{"type":52,"tag":121,"props":2757,"children":2758},{"style":159},[2759],{"type":57,"value":1062},{"type":52,"tag":121,"props":2761,"children":2762},{"class":123,"line":192},[2763,2767,2771,2775,2779,2783,2787,2792],{"type":52,"tag":121,"props":2764,"children":2765},{"style":128},[2766],{"type":57,"value":14},{"type":52,"tag":121,"props":2768,"children":2769},{"style":133},[2770],{"type":57,"value":619},{"type":52,"tag":121,"props":2772,"children":2773},{"style":133},[2774],{"type":57,"value":2598},{"type":52,"tag":121,"props":2776,"children":2777},{"style":133},[2778],{"type":57,"value":2673},{"type":52,"tag":121,"props":2780,"children":2781},{"style":133},[2782],{"type":57,"value":2678},{"type":52,"tag":121,"props":2784,"children":2785},{"style":159},[2786],{"type":57,"value":546},{"type":52,"tag":121,"props":2788,"children":2789},{"style":133},[2790],{"type":57,"value":2791},"document.documentElement.style.setProperty('--bg-color', '#1a1a2e')",{"type":52,"tag":121,"props":2793,"children":2794},{"style":159},[2795],{"type":57,"value":1062},{"type":52,"tag":495,"props":2797,"children":2799},{"id":2798},"_5-reading-application-logs",[2800],{"type":57,"value":2801},"5. Reading Application Logs",{"type":52,"tag":60,"props":2803,"children":2804},{},[2805,2807,2813,2815,2821],{"type":57,"value":2806},"MauiDevFlow automatically captures all ",{"type":52,"tag":66,"props":2808,"children":2810},{"className":2809},[],[2811],{"type":57,"value":2812},"ILogger",{"type":57,"value":2814}," output and WebView ",{"type":52,"tag":66,"props":2816,"children":2818},{"className":2817},[],[2819],{"type":57,"value":2820},"console.*",{"type":57,"value":2822}," calls\nto rotating log files, retrievable remotely:",{"type":52,"tag":110,"props":2824,"children":2826},{"className":112,"code":2825,"language":114,"meta":115,"style":115},"maui devflow ui logs                   # fetch 100 most recent log entries\nmaui devflow ui logs --limit 50        # fetch 50 entries\nmaui devflow ui logs --source webview  # only WebView\u002FBlazor console logs\nmaui devflow ui logs --source native   # only native ILogger logs\nmaui devflow ui logs --follow          # stream logs in real-time (Ctrl+C to stop)\nmaui devflow ui logs -f --source native  # stream only native logs\nmaui devflow ui logs -f --json         # stream as JSONL (machine-readable)\n",[2827],{"type":52,"tag":66,"props":2828,"children":2829},{"__ignoreMap":115},[2830,2855,2889,2922,2955,2984,3020],{"type":52,"tag":121,"props":2831,"children":2832},{"class":123,"line":124},[2833,2837,2841,2845,2850],{"type":52,"tag":121,"props":2834,"children":2835},{"style":128},[2836],{"type":57,"value":14},{"type":52,"tag":121,"props":2838,"children":2839},{"style":133},[2840],{"type":57,"value":619},{"type":52,"tag":121,"props":2842,"children":2843},{"style":133},[2844],{"type":57,"value":2197},{"type":52,"tag":121,"props":2846,"children":2847},{"style":133},[2848],{"type":57,"value":2849}," logs",{"type":52,"tag":121,"props":2851,"children":2852},{"style":217},[2853],{"type":57,"value":2854},"                   # fetch 100 most recent log entries\n",{"type":52,"tag":121,"props":2856,"children":2857},{"class":123,"line":192},[2858,2862,2866,2870,2874,2879,2884],{"type":52,"tag":121,"props":2859,"children":2860},{"style":128},[2861],{"type":57,"value":14},{"type":52,"tag":121,"props":2863,"children":2864},{"style":133},[2865],{"type":57,"value":619},{"type":52,"tag":121,"props":2867,"children":2868},{"style":133},[2869],{"type":57,"value":2197},{"type":52,"tag":121,"props":2871,"children":2872},{"style":133},[2873],{"type":57,"value":2849},{"type":52,"tag":121,"props":2875,"children":2876},{"style":133},[2877],{"type":57,"value":2878}," --limit",{"type":52,"tag":121,"props":2880,"children":2881},{"style":2665},[2882],{"type":57,"value":2883}," 50",{"type":52,"tag":121,"props":2885,"children":2886},{"style":217},[2887],{"type":57,"value":2888},"        # fetch 50 entries\n",{"type":52,"tag":121,"props":2890,"children":2891},{"class":123,"line":223},[2892,2896,2900,2904,2908,2913,2917],{"type":52,"tag":121,"props":2893,"children":2894},{"style":128},[2895],{"type":57,"value":14},{"type":52,"tag":121,"props":2897,"children":2898},{"style":133},[2899],{"type":57,"value":619},{"type":52,"tag":121,"props":2901,"children":2902},{"style":133},[2903],{"type":57,"value":2197},{"type":52,"tag":121,"props":2905,"children":2906},{"style":133},[2907],{"type":57,"value":2849},{"type":52,"tag":121,"props":2909,"children":2910},{"style":133},[2911],{"type":57,"value":2912}," --source",{"type":52,"tag":121,"props":2914,"children":2915},{"style":133},[2916],{"type":57,"value":2598},{"type":52,"tag":121,"props":2918,"children":2919},{"style":217},[2920],{"type":57,"value":2921},"  # only WebView\u002FBlazor console logs\n",{"type":52,"tag":121,"props":2923,"children":2924},{"class":123,"line":1008},[2925,2929,2933,2937,2941,2945,2950],{"type":52,"tag":121,"props":2926,"children":2927},{"style":128},[2928],{"type":57,"value":14},{"type":52,"tag":121,"props":2930,"children":2931},{"style":133},[2932],{"type":57,"value":619},{"type":52,"tag":121,"props":2934,"children":2935},{"style":133},[2936],{"type":57,"value":2197},{"type":52,"tag":121,"props":2938,"children":2939},{"style":133},[2940],{"type":57,"value":2849},{"type":52,"tag":121,"props":2942,"children":2943},{"style":133},[2944],{"type":57,"value":2912},{"type":52,"tag":121,"props":2946,"children":2947},{"style":133},[2948],{"type":57,"value":2949}," native",{"type":52,"tag":121,"props":2951,"children":2952},{"style":217},[2953],{"type":57,"value":2954},"   # only native ILogger logs\n",{"type":52,"tag":121,"props":2956,"children":2957},{"class":123,"line":1065},[2958,2962,2966,2970,2974,2979],{"type":52,"tag":121,"props":2959,"children":2960},{"style":128},[2961],{"type":57,"value":14},{"type":52,"tag":121,"props":2963,"children":2964},{"style":133},[2965],{"type":57,"value":619},{"type":52,"tag":121,"props":2967,"children":2968},{"style":133},[2969],{"type":57,"value":2197},{"type":52,"tag":121,"props":2971,"children":2972},{"style":133},[2973],{"type":57,"value":2849},{"type":52,"tag":121,"props":2975,"children":2976},{"style":133},[2977],{"type":57,"value":2978}," --follow",{"type":52,"tag":121,"props":2980,"children":2981},{"style":217},[2982],{"type":57,"value":2983},"          # stream logs in real-time (Ctrl+C to stop)\n",{"type":52,"tag":121,"props":2985,"children":2986},{"class":123,"line":1228},[2987,2991,2995,2999,3003,3007,3011,3015],{"type":52,"tag":121,"props":2988,"children":2989},{"style":128},[2990],{"type":57,"value":14},{"type":52,"tag":121,"props":2992,"children":2993},{"style":133},[2994],{"type":57,"value":619},{"type":52,"tag":121,"props":2996,"children":2997},{"style":133},[2998],{"type":57,"value":2197},{"type":52,"tag":121,"props":3000,"children":3001},{"style":133},[3002],{"type":57,"value":2849},{"type":52,"tag":121,"props":3004,"children":3005},{"style":133},[3006],{"type":57,"value":1489},{"type":52,"tag":121,"props":3008,"children":3009},{"style":133},[3010],{"type":57,"value":2912},{"type":52,"tag":121,"props":3012,"children":3013},{"style":133},[3014],{"type":57,"value":2949},{"type":52,"tag":121,"props":3016,"children":3017},{"style":217},[3018],{"type":57,"value":3019},"  # stream only native logs\n",{"type":52,"tag":121,"props":3021,"children":3022},{"class":123,"line":1578},[3023,3027,3031,3035,3039,3043,3048],{"type":52,"tag":121,"props":3024,"children":3025},{"style":128},[3026],{"type":57,"value":14},{"type":52,"tag":121,"props":3028,"children":3029},{"style":133},[3030],{"type":57,"value":619},{"type":52,"tag":121,"props":3032,"children":3033},{"style":133},[3034],{"type":57,"value":2197},{"type":52,"tag":121,"props":3036,"children":3037},{"style":133},[3038],{"type":57,"value":2849},{"type":52,"tag":121,"props":3040,"children":3041},{"style":133},[3042],{"type":57,"value":1489},{"type":52,"tag":121,"props":3044,"children":3045},{"style":133},[3046],{"type":57,"value":3047}," --json",{"type":52,"tag":121,"props":3049,"children":3050},{"style":217},[3051],{"type":57,"value":3052},"         # stream as JSONL (machine-readable)\n",{"type":52,"tag":60,"props":3054,"children":3055},{},[3056,3061,3063,3069,3071,3076],{"type":52,"tag":96,"props":3057,"children":3058},{},[3059],{"type":57,"value":3060},"Debugging workflow:",{"type":57,"value":3062}," Reproduce the issue → ",{"type":52,"tag":66,"props":3064,"children":3066},{"className":3065},[],[3067],{"type":57,"value":3068},"maui devflow ui logs --limit 20",{"type":57,"value":3070}," → check for\nerrors. Add temporary ",{"type":52,"tag":66,"props":3072,"children":3074},{"className":3073},[],[3075],{"type":57,"value":2812},{"type":57,"value":3077}," calls for more detail, rebuild, reproduce, and fetch logs again.",{"type":52,"tag":495,"props":3079,"children":3081},{"id":3080},"_6-screen-recording",[3082],{"type":57,"value":3083},"6. Screen Recording",{"type":52,"tag":60,"props":3085,"children":3086},{},[3087],{"type":57,"value":3088},"Capture video of the app while performing interactions. Recording is host-side (not in-app)\nusing platform-native tools.",{"type":52,"tag":110,"props":3090,"children":3092},{"className":112,"code":3091,"language":114,"meta":115,"style":115},"# Start recording (default 30s timeout)\nmaui devflow recording start --output demo.mp4\n\n# Interact with the app\nmaui devflow ui tap \u003CbuttonId>\nmaui devflow ui navigate \"\u002F\u002Fblazor\"\nmaui devflow ui fill \u003CentryId> \"Hello World\"\n\n# Stop and save\nmaui devflow recording stop\n",[3093],{"type":52,"tag":66,"props":3094,"children":3095},{"__ignoreMap":115},[3096,3104,3134,3141,3149,3186,3219,3269,3276,3284],{"type":52,"tag":121,"props":3097,"children":3098},{"class":123,"line":124},[3099],{"type":52,"tag":121,"props":3100,"children":3101},{"style":217},[3102],{"type":57,"value":3103},"# Start recording (default 30s timeout)\n",{"type":52,"tag":121,"props":3105,"children":3106},{"class":123,"line":192},[3107,3111,3115,3120,3124,3129],{"type":52,"tag":121,"props":3108,"children":3109},{"style":128},[3110],{"type":57,"value":14},{"type":52,"tag":121,"props":3112,"children":3113},{"style":133},[3114],{"type":57,"value":619},{"type":52,"tag":121,"props":3116,"children":3117},{"style":133},[3118],{"type":57,"value":3119}," recording",{"type":52,"tag":121,"props":3121,"children":3122},{"style":133},[3123],{"type":57,"value":1242},{"type":52,"tag":121,"props":3125,"children":3126},{"style":133},[3127],{"type":57,"value":3128}," --output",{"type":52,"tag":121,"props":3130,"children":3131},{"style":133},[3132],{"type":57,"value":3133}," demo.mp4\n",{"type":52,"tag":121,"props":3135,"children":3136},{"class":123,"line":223},[3137],{"type":52,"tag":121,"props":3138,"children":3139},{"emptyLinePlaceholder":994},[3140],{"type":57,"value":997},{"type":52,"tag":121,"props":3142,"children":3143},{"class":123,"line":1008},[3144],{"type":52,"tag":121,"props":3145,"children":3146},{"style":217},[3147],{"type":57,"value":3148},"# Interact with the app\n",{"type":52,"tag":121,"props":3150,"children":3151},{"class":123,"line":1065},[3152,3156,3160,3164,3169,3173,3178,3182],{"type":52,"tag":121,"props":3153,"children":3154},{"style":128},[3155],{"type":57,"value":14},{"type":52,"tag":121,"props":3157,"children":3158},{"style":133},[3159],{"type":57,"value":619},{"type":52,"tag":121,"props":3161,"children":3162},{"style":133},[3163],{"type":57,"value":2197},{"type":52,"tag":121,"props":3165,"children":3166},{"style":133},[3167],{"type":57,"value":3168}," tap",{"type":52,"tag":121,"props":3170,"children":3171},{"style":159},[3172],{"type":57,"value":1084},{"type":52,"tag":121,"props":3174,"children":3175},{"style":133},[3176],{"type":57,"value":3177},"buttonI",{"type":52,"tag":121,"props":3179,"children":3180},{"style":1092},[3181],{"type":57,"value":2216},{"type":52,"tag":121,"props":3183,"children":3184},{"style":159},[3185],{"type":57,"value":1524},{"type":52,"tag":121,"props":3187,"children":3188},{"class":123,"line":1228},[3189,3193,3197,3201,3206,3210,3215],{"type":52,"tag":121,"props":3190,"children":3191},{"style":128},[3192],{"type":57,"value":14},{"type":52,"tag":121,"props":3194,"children":3195},{"style":133},[3196],{"type":57,"value":619},{"type":52,"tag":121,"props":3198,"children":3199},{"style":133},[3200],{"type":57,"value":2197},{"type":52,"tag":121,"props":3202,"children":3203},{"style":133},[3204],{"type":57,"value":3205}," navigate",{"type":52,"tag":121,"props":3207,"children":3208},{"style":159},[3209],{"type":57,"value":546},{"type":52,"tag":121,"props":3211,"children":3212},{"style":133},[3213],{"type":57,"value":3214},"\u002F\u002Fblazor",{"type":52,"tag":121,"props":3216,"children":3217},{"style":159},[3218],{"type":57,"value":1062},{"type":52,"tag":121,"props":3220,"children":3221},{"class":123,"line":1578},[3222,3226,3230,3234,3239,3243,3248,3252,3256,3260,3265],{"type":52,"tag":121,"props":3223,"children":3224},{"style":128},[3225],{"type":57,"value":14},{"type":52,"tag":121,"props":3227,"children":3228},{"style":133},[3229],{"type":57,"value":619},{"type":52,"tag":121,"props":3231,"children":3232},{"style":133},[3233],{"type":57,"value":2197},{"type":52,"tag":121,"props":3235,"children":3236},{"style":133},[3237],{"type":57,"value":3238}," fill",{"type":52,"tag":121,"props":3240,"children":3241},{"style":159},[3242],{"type":57,"value":1084},{"type":52,"tag":121,"props":3244,"children":3245},{"style":133},[3246],{"type":57,"value":3247},"entryI",{"type":52,"tag":121,"props":3249,"children":3250},{"style":1092},[3251],{"type":57,"value":2216},{"type":52,"tag":121,"props":3253,"children":3254},{"style":159},[3255],{"type":57,"value":1100},{"type":52,"tag":121,"props":3257,"children":3258},{"style":159},[3259],{"type":57,"value":546},{"type":52,"tag":121,"props":3261,"children":3262},{"style":133},[3263],{"type":57,"value":3264},"Hello World",{"type":52,"tag":121,"props":3266,"children":3267},{"style":159},[3268],{"type":57,"value":1062},{"type":52,"tag":121,"props":3270,"children":3271},{"class":123,"line":1587},[3272],{"type":52,"tag":121,"props":3273,"children":3274},{"emptyLinePlaceholder":994},[3275],{"type":57,"value":997},{"type":52,"tag":121,"props":3277,"children":3278},{"class":123,"line":1616},[3279],{"type":52,"tag":121,"props":3280,"children":3281},{"style":217},[3282],{"type":57,"value":3283},"# Stop and save\n",{"type":52,"tag":121,"props":3285,"children":3286},{"class":123,"line":1624},[3287,3291,3295,3299],{"type":52,"tag":121,"props":3288,"children":3289},{"style":128},[3290],{"type":57,"value":14},{"type":52,"tag":121,"props":3292,"children":3293},{"style":133},[3294],{"type":57,"value":619},{"type":52,"tag":121,"props":3296,"children":3297},{"style":133},[3298],{"type":57,"value":3119},{"type":52,"tag":121,"props":3300,"children":3301},{"style":133},[3302],{"type":57,"value":3303}," stop\n",{"type":52,"tag":60,"props":3305,"children":3306},{},[3307,3312],{"type":52,"tag":96,"props":3308,"children":3309},{},[3310],{"type":57,"value":3311},"Platform tools used automatically by MauiDevFlow's recording backend",{"type":57,"value":3313}," (implementation detail —\ndo not invoke these directly unless the user explicitly asked for host-level recording):",{"type":52,"tag":343,"props":3315,"children":3316},{},[3317,3334,3348,3365],{"type":52,"tag":321,"props":3318,"children":3319},{},[3320,3325,3326,3332],{"type":52,"tag":96,"props":3321,"children":3322},{},[3323],{"type":57,"value":3324},"Android:",{"type":57,"value":792},{"type":52,"tag":66,"props":3327,"children":3329},{"className":3328},[],[3330],{"type":57,"value":3331},"adb screenrecord",{"type":57,"value":3333}," (max 180s, capped with warning)",{"type":52,"tag":321,"props":3335,"children":3336},{},[3337,3341,3342],{"type":52,"tag":96,"props":3338,"children":3339},{},[3340],{"type":57,"value":949},{"type":57,"value":792},{"type":52,"tag":66,"props":3343,"children":3345},{"className":3344},[],[3346],{"type":57,"value":3347},"xcrun simctl io recordVideo",{"type":52,"tag":321,"props":3349,"children":3350},{},[3351,3356,3357,3363],{"type":52,"tag":96,"props":3352,"children":3353},{},[3354],{"type":57,"value":3355},"Mac Catalyst \u002F macOS (AppKit):",{"type":57,"value":792},{"type":52,"tag":66,"props":3358,"children":3360},{"className":3359},[],[3361],{"type":57,"value":3362},"screencapture -v",{"type":57,"value":3364}," (targets app window when possible)",{"type":52,"tag":321,"props":3366,"children":3367},{},[3368,3373,3374,3380],{"type":52,"tag":96,"props":3369,"children":3370},{},[3371],{"type":57,"value":3372},"Windows\u002FLinux:",{"type":57,"value":792},{"type":52,"tag":66,"props":3375,"children":3377},{"className":3376},[],[3378],{"type":57,"value":3379},"ffmpeg",{"type":57,"value":3381}," (must be on PATH)",{"type":52,"tag":60,"props":3383,"children":3384},{},[3385,3390,3391,3397,3399,3405,3407,3413],{"type":52,"tag":96,"props":3386,"children":3387},{},[3388],{"type":57,"value":3389},"Options:",{"type":57,"value":792},{"type":52,"tag":66,"props":3392,"children":3394},{"className":3393},[],[3395],{"type":57,"value":3396},"--timeout \u003Cseconds>",{"type":57,"value":3398}," (default 30), ",{"type":52,"tag":66,"props":3400,"children":3402},{"className":3401},[],[3403],{"type":57,"value":3404},"--output \u003Cpath>",{"type":57,"value":3406}," (default ",{"type":52,"tag":66,"props":3408,"children":3410},{"className":3409},[],[3411],{"type":57,"value":3412},"recording_\u003Ctimestamp>.mp4",{"type":57,"value":3414},").\nOnly one recording at a time — stop before starting a new one.",{"type":52,"tag":495,"props":3416,"children":3418},{"id":3417},"_7-network-request-monitoring",[3419],{"type":57,"value":3420},"7. Network Request Monitoring",{"type":52,"tag":60,"props":3422,"children":3423},{},[3424,3426,3432,3434,3440,3442,3448],{"type":57,"value":3425},"Monitor HTTP requests made by the app in real-time. MauiDevFlow automatically intercepts\nall ",{"type":52,"tag":66,"props":3427,"children":3429},{"className":3428},[],[3430],{"type":57,"value":3431},"IHttpClientFactory",{"type":57,"value":3433},"-based HTTP traffic via a ",{"type":52,"tag":66,"props":3435,"children":3437},{"className":3436},[],[3438],{"type":57,"value":3439},"DelegatingHandler",{"type":57,"value":3441}," — no app code changes\nneeded beyond the standard ",{"type":52,"tag":66,"props":3443,"children":3445},{"className":3444},[],[3446],{"type":57,"value":3447},"AddMauiDevFlowAgent()",{"type":57,"value":3449}," setup.",{"type":52,"tag":110,"props":3451,"children":3453},{"className":112,"code":3452,"language":114,"meta":115,"style":115},"# Live monitor — streams requests as they happen (Ctrl+C to stop)\nmaui devflow network\n\n# JSONL streaming — machine-readable, one JSON object per line\nmaui devflow network --json\n\n# One-shot: list recent captured requests\nmaui devflow network list\n\n# Filter by method or host\nmaui devflow network list --method POST\nmaui devflow network list --host api.example.com\n\n# Full request\u002Fresponse details (headers + body)\nmaui devflow network detail \u003CrequestId>\n\n# Clear captured requests\nmaui devflow network clear\n",[3454],{"type":52,"tag":66,"props":3455,"children":3456},{"__ignoreMap":115},[3457,3465,3481,3488,3496,3517,3524,3532,3552,3559,3567,3596,3625,3632,3640,3677,3685,3694],{"type":52,"tag":121,"props":3458,"children":3459},{"class":123,"line":124},[3460],{"type":52,"tag":121,"props":3461,"children":3462},{"style":217},[3463],{"type":57,"value":3464},"# Live monitor — streams requests as they happen (Ctrl+C to stop)\n",{"type":52,"tag":121,"props":3466,"children":3467},{"class":123,"line":192},[3468,3472,3476],{"type":52,"tag":121,"props":3469,"children":3470},{"style":128},[3471],{"type":57,"value":14},{"type":52,"tag":121,"props":3473,"children":3474},{"style":133},[3475],{"type":57,"value":619},{"type":52,"tag":121,"props":3477,"children":3478},{"style":133},[3479],{"type":57,"value":3480}," network\n",{"type":52,"tag":121,"props":3482,"children":3483},{"class":123,"line":223},[3484],{"type":52,"tag":121,"props":3485,"children":3486},{"emptyLinePlaceholder":994},[3487],{"type":57,"value":997},{"type":52,"tag":121,"props":3489,"children":3490},{"class":123,"line":1008},[3491],{"type":52,"tag":121,"props":3492,"children":3493},{"style":217},[3494],{"type":57,"value":3495},"# JSONL streaming — machine-readable, one JSON object per line\n",{"type":52,"tag":121,"props":3497,"children":3498},{"class":123,"line":1065},[3499,3503,3507,3512],{"type":52,"tag":121,"props":3500,"children":3501},{"style":128},[3502],{"type":57,"value":14},{"type":52,"tag":121,"props":3504,"children":3505},{"style":133},[3506],{"type":57,"value":619},{"type":52,"tag":121,"props":3508,"children":3509},{"style":133},[3510],{"type":57,"value":3511}," network",{"type":52,"tag":121,"props":3513,"children":3514},{"style":133},[3515],{"type":57,"value":3516}," --json\n",{"type":52,"tag":121,"props":3518,"children":3519},{"class":123,"line":1228},[3520],{"type":52,"tag":121,"props":3521,"children":3522},{"emptyLinePlaceholder":994},[3523],{"type":57,"value":997},{"type":52,"tag":121,"props":3525,"children":3526},{"class":123,"line":1578},[3527],{"type":52,"tag":121,"props":3528,"children":3529},{"style":217},[3530],{"type":57,"value":3531},"# One-shot: list recent captured requests\n",{"type":52,"tag":121,"props":3533,"children":3534},{"class":123,"line":1587},[3535,3539,3543,3547],{"type":52,"tag":121,"props":3536,"children":3537},{"style":128},[3538],{"type":57,"value":14},{"type":52,"tag":121,"props":3540,"children":3541},{"style":133},[3542],{"type":57,"value":619},{"type":52,"tag":121,"props":3544,"children":3545},{"style":133},[3546],{"type":57,"value":3511},{"type":52,"tag":121,"props":3548,"children":3549},{"style":133},[3550],{"type":57,"value":3551}," list\n",{"type":52,"tag":121,"props":3553,"children":3554},{"class":123,"line":1616},[3555],{"type":52,"tag":121,"props":3556,"children":3557},{"emptyLinePlaceholder":994},[3558],{"type":57,"value":997},{"type":52,"tag":121,"props":3560,"children":3561},{"class":123,"line":1624},[3562],{"type":52,"tag":121,"props":3563,"children":3564},{"style":217},[3565],{"type":57,"value":3566},"# Filter by method or host\n",{"type":52,"tag":121,"props":3568,"children":3569},{"class":123,"line":1633},[3570,3574,3578,3582,3586,3591],{"type":52,"tag":121,"props":3571,"children":3572},{"style":128},[3573],{"type":57,"value":14},{"type":52,"tag":121,"props":3575,"children":3576},{"style":133},[3577],{"type":57,"value":619},{"type":52,"tag":121,"props":3579,"children":3580},{"style":133},[3581],{"type":57,"value":3511},{"type":52,"tag":121,"props":3583,"children":3584},{"style":133},[3585],{"type":57,"value":624},{"type":52,"tag":121,"props":3587,"children":3588},{"style":133},[3589],{"type":57,"value":3590}," --method",{"type":52,"tag":121,"props":3592,"children":3593},{"style":133},[3594],{"type":57,"value":3595}," POST\n",{"type":52,"tag":121,"props":3597,"children":3598},{"class":123,"line":1676},[3599,3603,3607,3611,3615,3620],{"type":52,"tag":121,"props":3600,"children":3601},{"style":128},[3602],{"type":57,"value":14},{"type":52,"tag":121,"props":3604,"children":3605},{"style":133},[3606],{"type":57,"value":619},{"type":52,"tag":121,"props":3608,"children":3609},{"style":133},[3610],{"type":57,"value":3511},{"type":52,"tag":121,"props":3612,"children":3613},{"style":133},[3614],{"type":57,"value":624},{"type":52,"tag":121,"props":3616,"children":3617},{"style":133},[3618],{"type":57,"value":3619}," --host",{"type":52,"tag":121,"props":3621,"children":3622},{"style":133},[3623],{"type":57,"value":3624}," api.example.com\n",{"type":52,"tag":121,"props":3626,"children":3627},{"class":123,"line":1699},[3628],{"type":52,"tag":121,"props":3629,"children":3630},{"emptyLinePlaceholder":994},[3631],{"type":57,"value":997},{"type":52,"tag":121,"props":3633,"children":3634},{"class":123,"line":1707},[3635],{"type":52,"tag":121,"props":3636,"children":3637},{"style":217},[3638],{"type":57,"value":3639},"# Full request\u002Fresponse details (headers + body)\n",{"type":52,"tag":121,"props":3641,"children":3642},{"class":123,"line":1716},[3643,3647,3651,3655,3660,3664,3669,3673],{"type":52,"tag":121,"props":3644,"children":3645},{"style":128},[3646],{"type":57,"value":14},{"type":52,"tag":121,"props":3648,"children":3649},{"style":133},[3650],{"type":57,"value":619},{"type":52,"tag":121,"props":3652,"children":3653},{"style":133},[3654],{"type":57,"value":3511},{"type":52,"tag":121,"props":3656,"children":3657},{"style":133},[3658],{"type":57,"value":3659}," detail",{"type":52,"tag":121,"props":3661,"children":3662},{"style":159},[3663],{"type":57,"value":1084},{"type":52,"tag":121,"props":3665,"children":3666},{"style":133},[3667],{"type":57,"value":3668},"requestI",{"type":52,"tag":121,"props":3670,"children":3671},{"style":1092},[3672],{"type":57,"value":2216},{"type":52,"tag":121,"props":3674,"children":3675},{"style":159},[3676],{"type":57,"value":1524},{"type":52,"tag":121,"props":3678,"children":3680},{"class":123,"line":3679},16,[3681],{"type":52,"tag":121,"props":3682,"children":3683},{"emptyLinePlaceholder":994},[3684],{"type":57,"value":997},{"type":52,"tag":121,"props":3686,"children":3688},{"class":123,"line":3687},17,[3689],{"type":52,"tag":121,"props":3690,"children":3691},{"style":217},[3692],{"type":57,"value":3693},"# Clear captured requests\n",{"type":52,"tag":121,"props":3695,"children":3697},{"class":123,"line":3696},18,[3698,3702,3706,3710],{"type":52,"tag":121,"props":3699,"children":3700},{"style":128},[3701],{"type":57,"value":14},{"type":52,"tag":121,"props":3703,"children":3704},{"style":133},[3705],{"type":57,"value":619},{"type":52,"tag":121,"props":3707,"children":3708},{"style":133},[3709],{"type":57,"value":3511},{"type":52,"tag":121,"props":3711,"children":3712},{"style":133},[3713],{"type":57,"value":3714}," clear\n",{"type":52,"tag":60,"props":3716,"children":3717},{},[3718],{"type":52,"tag":96,"props":3719,"children":3720},{},[3721],{"type":57,"value":3722},"How it works:",{"type":52,"tag":343,"props":3724,"children":3725},{},[3726,3738,3758,3778,3791],{"type":52,"tag":321,"props":3727,"children":3728},{},[3729,3731,3736],{"type":57,"value":3730},"A ",{"type":52,"tag":66,"props":3732,"children":3734},{"className":3733},[],[3735],{"type":57,"value":3439},{"type":57,"value":3737}," wraps the platform's HTTP handler (AndroidMessageHandler,\nNSUrlSessionHandler, etc.), capturing request\u002Fresponse metadata, headers, and bodies",{"type":52,"tag":321,"props":3739,"children":3740},{},[3741,3743,3749,3751,3756],{"type":57,"value":3742},"Auto-injected via ",{"type":52,"tag":66,"props":3744,"children":3746},{"className":3745},[],[3747],{"type":57,"value":3748},"ConfigureHttpClientDefaults",{"type":57,"value":3750}," — works for all ",{"type":52,"tag":66,"props":3752,"children":3754},{"className":3753},[],[3755],{"type":57,"value":3431},{"type":57,"value":3757}," clients",{"type":52,"tag":321,"props":3759,"children":3760},{},[3761,3762,3768,3770,3776],{"type":57,"value":350},{"type":52,"tag":66,"props":3763,"children":3765},{"className":3764},[],[3766],{"type":57,"value":3767},"new HttpClient()",{"type":57,"value":3769}," outside DI, use ",{"type":52,"tag":66,"props":3771,"children":3773},{"className":3772},[],[3774],{"type":57,"value":3775},"DevFlowHttp.CreateClient()",{"type":57,"value":3777}," helper",{"type":52,"tag":321,"props":3779,"children":3780},{},[3781,3783,3789],{"type":57,"value":3782},"Bodies up to 256KB are captured (configurable via ",{"type":52,"tag":66,"props":3784,"children":3786},{"className":3785},[],[3787],{"type":57,"value":3788},"AgentOptions.MaxNetworkBodySize",{"type":57,"value":3790},")",{"type":52,"tag":321,"props":3792,"children":3793},{},[3794],{"type":57,"value":3795},"A ring buffer (default 500 entries) stores recent requests in-memory",{"type":52,"tag":60,"props":3797,"children":3798},{},[3799,3804,3806,3812],{"type":52,"tag":96,"props":3800,"children":3801},{},[3802],{"type":57,"value":3803},"JSONL output",{"type":57,"value":3805}," is ideal for AI parsing — pipe to ",{"type":52,"tag":66,"props":3807,"children":3809},{"className":3808},[],[3810],{"type":57,"value":3811},"jq",{"type":57,"value":3813}," or process programmatically:",{"type":52,"tag":110,"props":3815,"children":3817},{"className":112,"code":3816,"language":114,"meta":115,"style":115},"maui devflow network --json | jq 'select(.statusCode >= 400)'\n",[3818],{"type":52,"tag":66,"props":3819,"children":3820},{"__ignoreMap":115},[3821],{"type":52,"tag":121,"props":3822,"children":3823},{"class":123,"line":124},[3824,3828,3832,3836,3840,3845,3850,3854,3859],{"type":52,"tag":121,"props":3825,"children":3826},{"style":128},[3827],{"type":57,"value":14},{"type":52,"tag":121,"props":3829,"children":3830},{"style":133},[3831],{"type":57,"value":619},{"type":52,"tag":121,"props":3833,"children":3834},{"style":133},[3835],{"type":57,"value":3511},{"type":52,"tag":121,"props":3837,"children":3838},{"style":133},[3839],{"type":57,"value":3047},{"type":52,"tag":121,"props":3841,"children":3842},{"style":159},[3843],{"type":57,"value":3844}," |",{"type":52,"tag":121,"props":3846,"children":3847},{"style":128},[3848],{"type":57,"value":3849}," jq",{"type":52,"tag":121,"props":3851,"children":3852},{"style":159},[3853],{"type":57,"value":1332},{"type":52,"tag":121,"props":3855,"children":3856},{"style":133},[3857],{"type":57,"value":3858},"select(.statusCode >= 400)",{"type":52,"tag":121,"props":3860,"children":3861},{"style":159},[3862],{"type":57,"value":3863},"'\n",{"type":52,"tag":60,"props":3865,"children":3866},{},[3867,3872,3874,3880],{"type":52,"tag":96,"props":3868,"children":3869},{},[3870],{"type":57,"value":3871},"WebSocket streaming:",{"type":57,"value":3873}," The live monitor uses WebSocket (",{"type":52,"tag":66,"props":3875,"children":3877},{"className":3876},[],[3878],{"type":57,"value":3879},"\u002Fws\u002Fnetwork",{"type":57,"value":3881},") for real-time push.\nConnecting clients receive a replay of buffered history, then live entries as they arrive.",{"type":52,"tag":495,"props":3883,"children":3885},{"id":3884},"_8-app-storage-preferences-secure-storage",[3886],{"type":57,"value":3887},"8. App Storage (Preferences & Secure Storage)",{"type":52,"tag":60,"props":3889,"children":3890},{},[3891],{"type":57,"value":3892},"Read, write, and delete app preferences and secure storage entries remotely. Useful for\ndebugging state, resetting app configuration, or injecting test values.",{"type":52,"tag":110,"props":3894,"children":3896},{"className":112,"code":3895,"language":114,"meta":115,"style":115},"# Preferences (typed key-value store)\nmaui devflow preferences list                       # list all known keys\nmaui devflow preferences get theme_mode             # get a string value\nmaui devflow preferences get counter --type int     # get a typed value\nmaui devflow preferences set api_url \"https:\u002F\u002Fdev.example.com\"\nmaui devflow preferences set dark_mode true --type bool\nmaui devflow preferences delete temp_key\nmaui devflow preferences clear                      # clear all\n\n# Shared preferences containers\nmaui devflow preferences list --sharedName settings\nmaui devflow preferences set key val --sharedName settings\n\n# Secure Storage (encrypted, string values only)\nmaui devflow secure-storage get auth_token\nmaui devflow secure-storage set auth_token \"eyJhbGc...\"\nmaui devflow secure-storage delete auth_token\nmaui devflow secure-storage clear\n",[3897],{"type":52,"tag":66,"props":3898,"children":3899},{"__ignoreMap":115},[3900,3908,3933,3963,4002,4040,4078,4103,4128,4135,4143,4172,4209,4216,4224,4249,4286,4309],{"type":52,"tag":121,"props":3901,"children":3902},{"class":123,"line":124},[3903],{"type":52,"tag":121,"props":3904,"children":3905},{"style":217},[3906],{"type":57,"value":3907},"# Preferences (typed key-value store)\n",{"type":52,"tag":121,"props":3909,"children":3910},{"class":123,"line":192},[3911,3915,3919,3924,3928],{"type":52,"tag":121,"props":3912,"children":3913},{"style":128},[3914],{"type":57,"value":14},{"type":52,"tag":121,"props":3916,"children":3917},{"style":133},[3918],{"type":57,"value":619},{"type":52,"tag":121,"props":3920,"children":3921},{"style":133},[3922],{"type":57,"value":3923}," preferences",{"type":52,"tag":121,"props":3925,"children":3926},{"style":133},[3927],{"type":57,"value":624},{"type":52,"tag":121,"props":3929,"children":3930},{"style":217},[3931],{"type":57,"value":3932},"                       # list all known keys\n",{"type":52,"tag":121,"props":3934,"children":3935},{"class":123,"line":223},[3936,3940,3944,3948,3953,3958],{"type":52,"tag":121,"props":3937,"children":3938},{"style":128},[3939],{"type":57,"value":14},{"type":52,"tag":121,"props":3941,"children":3942},{"style":133},[3943],{"type":57,"value":619},{"type":52,"tag":121,"props":3945,"children":3946},{"style":133},[3947],{"type":57,"value":3923},{"type":52,"tag":121,"props":3949,"children":3950},{"style":133},[3951],{"type":57,"value":3952}," get",{"type":52,"tag":121,"props":3954,"children":3955},{"style":133},[3956],{"type":57,"value":3957}," theme_mode",{"type":52,"tag":121,"props":3959,"children":3960},{"style":217},[3961],{"type":57,"value":3962},"             # get a string value\n",{"type":52,"tag":121,"props":3964,"children":3965},{"class":123,"line":1008},[3966,3970,3974,3978,3982,3987,3992,3997],{"type":52,"tag":121,"props":3967,"children":3968},{"style":128},[3969],{"type":57,"value":14},{"type":52,"tag":121,"props":3971,"children":3972},{"style":133},[3973],{"type":57,"value":619},{"type":52,"tag":121,"props":3975,"children":3976},{"style":133},[3977],{"type":57,"value":3923},{"type":52,"tag":121,"props":3979,"children":3980},{"style":133},[3981],{"type":57,"value":3952},{"type":52,"tag":121,"props":3983,"children":3984},{"style":133},[3985],{"type":57,"value":3986}," counter",{"type":52,"tag":121,"props":3988,"children":3989},{"style":133},[3990],{"type":57,"value":3991}," --type",{"type":52,"tag":121,"props":3993,"children":3994},{"style":133},[3995],{"type":57,"value":3996}," int",{"type":52,"tag":121,"props":3998,"children":3999},{"style":217},[4000],{"type":57,"value":4001},"     # get a typed value\n",{"type":52,"tag":121,"props":4003,"children":4004},{"class":123,"line":1065},[4005,4009,4013,4017,4022,4027,4031,4036],{"type":52,"tag":121,"props":4006,"children":4007},{"style":128},[4008],{"type":57,"value":14},{"type":52,"tag":121,"props":4010,"children":4011},{"style":133},[4012],{"type":57,"value":619},{"type":52,"tag":121,"props":4014,"children":4015},{"style":133},[4016],{"type":57,"value":3923},{"type":52,"tag":121,"props":4018,"children":4019},{"style":133},[4020],{"type":57,"value":4021}," set",{"type":52,"tag":121,"props":4023,"children":4024},{"style":133},[4025],{"type":57,"value":4026}," api_url",{"type":52,"tag":121,"props":4028,"children":4029},{"style":159},[4030],{"type":57,"value":546},{"type":52,"tag":121,"props":4032,"children":4033},{"style":133},[4034],{"type":57,"value":4035},"https:\u002F\u002Fdev.example.com",{"type":52,"tag":121,"props":4037,"children":4038},{"style":159},[4039],{"type":57,"value":1062},{"type":52,"tag":121,"props":4041,"children":4042},{"class":123,"line":1228},[4043,4047,4051,4055,4059,4064,4069,4073],{"type":52,"tag":121,"props":4044,"children":4045},{"style":128},[4046],{"type":57,"value":14},{"type":52,"tag":121,"props":4048,"children":4049},{"style":133},[4050],{"type":57,"value":619},{"type":52,"tag":121,"props":4052,"children":4053},{"style":133},[4054],{"type":57,"value":3923},{"type":52,"tag":121,"props":4056,"children":4057},{"style":133},[4058],{"type":57,"value":4021},{"type":52,"tag":121,"props":4060,"children":4061},{"style":133},[4062],{"type":57,"value":4063}," dark_mode",{"type":52,"tag":121,"props":4065,"children":4066},{"style":159},[4067],{"type":57,"value":4068}," true",{"type":52,"tag":121,"props":4070,"children":4071},{"style":133},[4072],{"type":57,"value":3991},{"type":52,"tag":121,"props":4074,"children":4075},{"style":133},[4076],{"type":57,"value":4077}," bool\n",{"type":52,"tag":121,"props":4079,"children":4080},{"class":123,"line":1578},[4081,4085,4089,4093,4098],{"type":52,"tag":121,"props":4082,"children":4083},{"style":128},[4084],{"type":57,"value":14},{"type":52,"tag":121,"props":4086,"children":4087},{"style":133},[4088],{"type":57,"value":619},{"type":52,"tag":121,"props":4090,"children":4091},{"style":133},[4092],{"type":57,"value":3923},{"type":52,"tag":121,"props":4094,"children":4095},{"style":133},[4096],{"type":57,"value":4097}," delete",{"type":52,"tag":121,"props":4099,"children":4100},{"style":133},[4101],{"type":57,"value":4102}," temp_key\n",{"type":52,"tag":121,"props":4104,"children":4105},{"class":123,"line":1587},[4106,4110,4114,4118,4123],{"type":52,"tag":121,"props":4107,"children":4108},{"style":128},[4109],{"type":57,"value":14},{"type":52,"tag":121,"props":4111,"children":4112},{"style":133},[4113],{"type":57,"value":619},{"type":52,"tag":121,"props":4115,"children":4116},{"style":133},[4117],{"type":57,"value":3923},{"type":52,"tag":121,"props":4119,"children":4120},{"style":133},[4121],{"type":57,"value":4122}," clear",{"type":52,"tag":121,"props":4124,"children":4125},{"style":217},[4126],{"type":57,"value":4127},"                      # clear all\n",{"type":52,"tag":121,"props":4129,"children":4130},{"class":123,"line":1616},[4131],{"type":52,"tag":121,"props":4132,"children":4133},{"emptyLinePlaceholder":994},[4134],{"type":57,"value":997},{"type":52,"tag":121,"props":4136,"children":4137},{"class":123,"line":1624},[4138],{"type":52,"tag":121,"props":4139,"children":4140},{"style":217},[4141],{"type":57,"value":4142},"# Shared preferences containers\n",{"type":52,"tag":121,"props":4144,"children":4145},{"class":123,"line":1633},[4146,4150,4154,4158,4162,4167],{"type":52,"tag":121,"props":4147,"children":4148},{"style":128},[4149],{"type":57,"value":14},{"type":52,"tag":121,"props":4151,"children":4152},{"style":133},[4153],{"type":57,"value":619},{"type":52,"tag":121,"props":4155,"children":4156},{"style":133},[4157],{"type":57,"value":3923},{"type":52,"tag":121,"props":4159,"children":4160},{"style":133},[4161],{"type":57,"value":624},{"type":52,"tag":121,"props":4163,"children":4164},{"style":133},[4165],{"type":57,"value":4166}," --sharedName",{"type":52,"tag":121,"props":4168,"children":4169},{"style":133},[4170],{"type":57,"value":4171}," settings\n",{"type":52,"tag":121,"props":4173,"children":4174},{"class":123,"line":1676},[4175,4179,4183,4187,4191,4196,4201,4205],{"type":52,"tag":121,"props":4176,"children":4177},{"style":128},[4178],{"type":57,"value":14},{"type":52,"tag":121,"props":4180,"children":4181},{"style":133},[4182],{"type":57,"value":619},{"type":52,"tag":121,"props":4184,"children":4185},{"style":133},[4186],{"type":57,"value":3923},{"type":52,"tag":121,"props":4188,"children":4189},{"style":133},[4190],{"type":57,"value":4021},{"type":52,"tag":121,"props":4192,"children":4193},{"style":133},[4194],{"type":57,"value":4195}," key",{"type":52,"tag":121,"props":4197,"children":4198},{"style":133},[4199],{"type":57,"value":4200}," val",{"type":52,"tag":121,"props":4202,"children":4203},{"style":133},[4204],{"type":57,"value":4166},{"type":52,"tag":121,"props":4206,"children":4207},{"style":133},[4208],{"type":57,"value":4171},{"type":52,"tag":121,"props":4210,"children":4211},{"class":123,"line":1699},[4212],{"type":52,"tag":121,"props":4213,"children":4214},{"emptyLinePlaceholder":994},[4215],{"type":57,"value":997},{"type":52,"tag":121,"props":4217,"children":4218},{"class":123,"line":1707},[4219],{"type":52,"tag":121,"props":4220,"children":4221},{"style":217},[4222],{"type":57,"value":4223},"# Secure Storage (encrypted, string values only)\n",{"type":52,"tag":121,"props":4225,"children":4226},{"class":123,"line":1716},[4227,4231,4235,4240,4244],{"type":52,"tag":121,"props":4228,"children":4229},{"style":128},[4230],{"type":57,"value":14},{"type":52,"tag":121,"props":4232,"children":4233},{"style":133},[4234],{"type":57,"value":619},{"type":52,"tag":121,"props":4236,"children":4237},{"style":133},[4238],{"type":57,"value":4239}," secure-storage",{"type":52,"tag":121,"props":4241,"children":4242},{"style":133},[4243],{"type":57,"value":3952},{"type":52,"tag":121,"props":4245,"children":4246},{"style":133},[4247],{"type":57,"value":4248}," auth_token\n",{"type":52,"tag":121,"props":4250,"children":4251},{"class":123,"line":3679},[4252,4256,4260,4264,4268,4273,4277,4282],{"type":52,"tag":121,"props":4253,"children":4254},{"style":128},[4255],{"type":57,"value":14},{"type":52,"tag":121,"props":4257,"children":4258},{"style":133},[4259],{"type":57,"value":619},{"type":52,"tag":121,"props":4261,"children":4262},{"style":133},[4263],{"type":57,"value":4239},{"type":52,"tag":121,"props":4265,"children":4266},{"style":133},[4267],{"type":57,"value":4021},{"type":52,"tag":121,"props":4269,"children":4270},{"style":133},[4271],{"type":57,"value":4272}," auth_token",{"type":52,"tag":121,"props":4274,"children":4275},{"style":159},[4276],{"type":57,"value":546},{"type":52,"tag":121,"props":4278,"children":4279},{"style":133},[4280],{"type":57,"value":4281},"eyJhbGc...",{"type":52,"tag":121,"props":4283,"children":4284},{"style":159},[4285],{"type":57,"value":1062},{"type":52,"tag":121,"props":4287,"children":4288},{"class":123,"line":3687},[4289,4293,4297,4301,4305],{"type":52,"tag":121,"props":4290,"children":4291},{"style":128},[4292],{"type":57,"value":14},{"type":52,"tag":121,"props":4294,"children":4295},{"style":133},[4296],{"type":57,"value":619},{"type":52,"tag":121,"props":4298,"children":4299},{"style":133},[4300],{"type":57,"value":4239},{"type":52,"tag":121,"props":4302,"children":4303},{"style":133},[4304],{"type":57,"value":4097},{"type":52,"tag":121,"props":4306,"children":4307},{"style":133},[4308],{"type":57,"value":4248},{"type":52,"tag":121,"props":4310,"children":4311},{"class":123,"line":3696},[4312,4316,4320,4324],{"type":52,"tag":121,"props":4313,"children":4314},{"style":128},[4315],{"type":57,"value":14},{"type":52,"tag":121,"props":4317,"children":4318},{"style":133},[4319],{"type":57,"value":619},{"type":52,"tag":121,"props":4321,"children":4322},{"style":133},[4323],{"type":57,"value":4239},{"type":52,"tag":121,"props":4325,"children":4326},{"style":133},[4327],{"type":57,"value":3714},{"type":52,"tag":60,"props":4329,"children":4330},{},[4331,4336,4338,4343],{"type":52,"tag":96,"props":4332,"children":4333},{},[4334],{"type":57,"value":4335},"Note:",{"type":57,"value":4337}," Preference key listing uses an internal registry (keys set via the agent are tracked).\nKeys set directly in app code won't appear in ",{"type":52,"tag":66,"props":4339,"children":4341},{"className":4340},[],[4342],{"type":57,"value":713},{"type":57,"value":4344}," unless also set via the agent.",{"type":52,"tag":495,"props":4346,"children":4348},{"id":4347},"_9-platform-info-device-features",[4349],{"type":57,"value":4350},"9. Platform Info & Device Features",{"type":52,"tag":60,"props":4352,"children":4353},{},[4354],{"type":57,"value":4355},"Query read-only device and app state. These are one-shot snapshot reads.",{"type":52,"tag":110,"props":4357,"children":4359},{"className":112,"code":4358,"language":114,"meta":115,"style":115},"maui devflow platform app-info         # app name, version, build, theme\nmaui devflow platform device-info      # manufacturer, model, OS, idiom\nmaui devflow platform display          # screen density, size, orientation\nmaui devflow platform battery          # charge level, state, power source\nmaui devflow platform connectivity     # WiFi\u002FCellular\u002FEthernet, network access\nmaui devflow platform version-tracking # version history, first launch detection\nmaui devflow platform permissions      # check all common permission statuses\nmaui devflow platform permissions camera  # check a specific permission\nmaui devflow platform geolocation      # current GPS coordinates\nmaui devflow platform geolocation --accuracy High --timeout 15\n",[4360],{"type":52,"tag":66,"props":4361,"children":4362},{"__ignoreMap":115},[4363,4389,4414,4439,4464,4489,4514,4539,4568,4593],{"type":52,"tag":121,"props":4364,"children":4365},{"class":123,"line":124},[4366,4370,4374,4379,4384],{"type":52,"tag":121,"props":4367,"children":4368},{"style":128},[4369],{"type":57,"value":14},{"type":52,"tag":121,"props":4371,"children":4372},{"style":133},[4373],{"type":57,"value":619},{"type":52,"tag":121,"props":4375,"children":4376},{"style":133},[4377],{"type":57,"value":4378}," platform",{"type":52,"tag":121,"props":4380,"children":4381},{"style":133},[4382],{"type":57,"value":4383}," app-info",{"type":52,"tag":121,"props":4385,"children":4386},{"style":217},[4387],{"type":57,"value":4388},"         # app name, version, build, theme\n",{"type":52,"tag":121,"props":4390,"children":4391},{"class":123,"line":192},[4392,4396,4400,4404,4409],{"type":52,"tag":121,"props":4393,"children":4394},{"style":128},[4395],{"type":57,"value":14},{"type":52,"tag":121,"props":4397,"children":4398},{"style":133},[4399],{"type":57,"value":619},{"type":52,"tag":121,"props":4401,"children":4402},{"style":133},[4403],{"type":57,"value":4378},{"type":52,"tag":121,"props":4405,"children":4406},{"style":133},[4407],{"type":57,"value":4408}," device-info",{"type":52,"tag":121,"props":4410,"children":4411},{"style":217},[4412],{"type":57,"value":4413},"      # manufacturer, model, OS, idiom\n",{"type":52,"tag":121,"props":4415,"children":4416},{"class":123,"line":223},[4417,4421,4425,4429,4434],{"type":52,"tag":121,"props":4418,"children":4419},{"style":128},[4420],{"type":57,"value":14},{"type":52,"tag":121,"props":4422,"children":4423},{"style":133},[4424],{"type":57,"value":619},{"type":52,"tag":121,"props":4426,"children":4427},{"style":133},[4428],{"type":57,"value":4378},{"type":52,"tag":121,"props":4430,"children":4431},{"style":133},[4432],{"type":57,"value":4433}," display",{"type":52,"tag":121,"props":4435,"children":4436},{"style":217},[4437],{"type":57,"value":4438},"          # screen density, size, orientation\n",{"type":52,"tag":121,"props":4440,"children":4441},{"class":123,"line":1008},[4442,4446,4450,4454,4459],{"type":52,"tag":121,"props":4443,"children":4444},{"style":128},[4445],{"type":57,"value":14},{"type":52,"tag":121,"props":4447,"children":4448},{"style":133},[4449],{"type":57,"value":619},{"type":52,"tag":121,"props":4451,"children":4452},{"style":133},[4453],{"type":57,"value":4378},{"type":52,"tag":121,"props":4455,"children":4456},{"style":133},[4457],{"type":57,"value":4458}," battery",{"type":52,"tag":121,"props":4460,"children":4461},{"style":217},[4462],{"type":57,"value":4463},"          # charge level, state, power source\n",{"type":52,"tag":121,"props":4465,"children":4466},{"class":123,"line":1065},[4467,4471,4475,4479,4484],{"type":52,"tag":121,"props":4468,"children":4469},{"style":128},[4470],{"type":57,"value":14},{"type":52,"tag":121,"props":4472,"children":4473},{"style":133},[4474],{"type":57,"value":619},{"type":52,"tag":121,"props":4476,"children":4477},{"style":133},[4478],{"type":57,"value":4378},{"type":52,"tag":121,"props":4480,"children":4481},{"style":133},[4482],{"type":57,"value":4483}," connectivity",{"type":52,"tag":121,"props":4485,"children":4486},{"style":217},[4487],{"type":57,"value":4488},"     # WiFi\u002FCellular\u002FEthernet, network access\n",{"type":52,"tag":121,"props":4490,"children":4491},{"class":123,"line":1228},[4492,4496,4500,4504,4509],{"type":52,"tag":121,"props":4493,"children":4494},{"style":128},[4495],{"type":57,"value":14},{"type":52,"tag":121,"props":4497,"children":4498},{"style":133},[4499],{"type":57,"value":619},{"type":52,"tag":121,"props":4501,"children":4502},{"style":133},[4503],{"type":57,"value":4378},{"type":52,"tag":121,"props":4505,"children":4506},{"style":133},[4507],{"type":57,"value":4508}," version-tracking",{"type":52,"tag":121,"props":4510,"children":4511},{"style":217},[4512],{"type":57,"value":4513}," # version history, first launch detection\n",{"type":52,"tag":121,"props":4515,"children":4516},{"class":123,"line":1578},[4517,4521,4525,4529,4534],{"type":52,"tag":121,"props":4518,"children":4519},{"style":128},[4520],{"type":57,"value":14},{"type":52,"tag":121,"props":4522,"children":4523},{"style":133},[4524],{"type":57,"value":619},{"type":52,"tag":121,"props":4526,"children":4527},{"style":133},[4528],{"type":57,"value":4378},{"type":52,"tag":121,"props":4530,"children":4531},{"style":133},[4532],{"type":57,"value":4533}," permissions",{"type":52,"tag":121,"props":4535,"children":4536},{"style":217},[4537],{"type":57,"value":4538},"      # check all common permission statuses\n",{"type":52,"tag":121,"props":4540,"children":4541},{"class":123,"line":1587},[4542,4546,4550,4554,4558,4563],{"type":52,"tag":121,"props":4543,"children":4544},{"style":128},[4545],{"type":57,"value":14},{"type":52,"tag":121,"props":4547,"children":4548},{"style":133},[4549],{"type":57,"value":619},{"type":52,"tag":121,"props":4551,"children":4552},{"style":133},[4553],{"type":57,"value":4378},{"type":52,"tag":121,"props":4555,"children":4556},{"style":133},[4557],{"type":57,"value":4533},{"type":52,"tag":121,"props":4559,"children":4560},{"style":133},[4561],{"type":57,"value":4562}," camera",{"type":52,"tag":121,"props":4564,"children":4565},{"style":217},[4566],{"type":57,"value":4567},"  # check a specific permission\n",{"type":52,"tag":121,"props":4569,"children":4570},{"class":123,"line":1616},[4571,4575,4579,4583,4588],{"type":52,"tag":121,"props":4572,"children":4573},{"style":128},[4574],{"type":57,"value":14},{"type":52,"tag":121,"props":4576,"children":4577},{"style":133},[4578],{"type":57,"value":619},{"type":52,"tag":121,"props":4580,"children":4581},{"style":133},[4582],{"type":57,"value":4378},{"type":52,"tag":121,"props":4584,"children":4585},{"style":133},[4586],{"type":57,"value":4587}," geolocation",{"type":52,"tag":121,"props":4589,"children":4590},{"style":217},[4591],{"type":57,"value":4592},"      # current GPS coordinates\n",{"type":52,"tag":121,"props":4594,"children":4595},{"class":123,"line":1624},[4596,4600,4604,4608,4612,4617,4622,4627],{"type":52,"tag":121,"props":4597,"children":4598},{"style":128},[4599],{"type":57,"value":14},{"type":52,"tag":121,"props":4601,"children":4602},{"style":133},[4603],{"type":57,"value":619},{"type":52,"tag":121,"props":4605,"children":4606},{"style":133},[4607],{"type":57,"value":4378},{"type":52,"tag":121,"props":4609,"children":4610},{"style":133},[4611],{"type":57,"value":4587},{"type":52,"tag":121,"props":4613,"children":4614},{"style":133},[4615],{"type":57,"value":4616}," --accuracy",{"type":52,"tag":121,"props":4618,"children":4619},{"style":133},[4620],{"type":57,"value":4621}," High",{"type":52,"tag":121,"props":4623,"children":4624},{"style":133},[4625],{"type":57,"value":4626}," --timeout",{"type":52,"tag":121,"props":4628,"children":4629},{"style":2665},[4630],{"type":57,"value":4631}," 15\n",{"type":52,"tag":495,"props":4633,"children":4635},{"id":4634},"_10-device-sensors",[4636],{"type":57,"value":4637},"10. Device Sensors",{"type":52,"tag":60,"props":4639,"children":4640},{},[4641],{"type":57,"value":4642},"Start, stop, and stream real-time sensor data. Sensors auto-start when streaming.",{"type":52,"tag":110,"props":4644,"children":4646},{"className":112,"code":4645,"language":114,"meta":115,"style":115},"maui devflow sensors list                    # list sensors + status\nmaui devflow sensors start accelerometer     # start a sensor\nmaui devflow sensors stop accelerometer\n\n# Stream readings to stdout (JSONL)\nmaui devflow sensors stream accelerometer          # Ctrl+C to stop\nmaui devflow sensors stream gyroscope --speed Game  # higher frequency\nmaui devflow sensors stream compass --duration 10  # stop after 10 seconds\n",[4647],{"type":52,"tag":66,"props":4648,"children":4649},{"__ignoreMap":115},[4650,4675,4704,4729,4736,4744,4773,4812],{"type":52,"tag":121,"props":4651,"children":4652},{"class":123,"line":124},[4653,4657,4661,4666,4670],{"type":52,"tag":121,"props":4654,"children":4655},{"style":128},[4656],{"type":57,"value":14},{"type":52,"tag":121,"props":4658,"children":4659},{"style":133},[4660],{"type":57,"value":619},{"type":52,"tag":121,"props":4662,"children":4663},{"style":133},[4664],{"type":57,"value":4665}," sensors",{"type":52,"tag":121,"props":4667,"children":4668},{"style":133},[4669],{"type":57,"value":624},{"type":52,"tag":121,"props":4671,"children":4672},{"style":217},[4673],{"type":57,"value":4674},"                    # list sensors + status\n",{"type":52,"tag":121,"props":4676,"children":4677},{"class":123,"line":192},[4678,4682,4686,4690,4694,4699],{"type":52,"tag":121,"props":4679,"children":4680},{"style":128},[4681],{"type":57,"value":14},{"type":52,"tag":121,"props":4683,"children":4684},{"style":133},[4685],{"type":57,"value":619},{"type":52,"tag":121,"props":4687,"children":4688},{"style":133},[4689],{"type":57,"value":4665},{"type":52,"tag":121,"props":4691,"children":4692},{"style":133},[4693],{"type":57,"value":1242},{"type":52,"tag":121,"props":4695,"children":4696},{"style":133},[4697],{"type":57,"value":4698}," accelerometer",{"type":52,"tag":121,"props":4700,"children":4701},{"style":217},[4702],{"type":57,"value":4703},"     # start a sensor\n",{"type":52,"tag":121,"props":4705,"children":4706},{"class":123,"line":223},[4707,4711,4715,4719,4724],{"type":52,"tag":121,"props":4708,"children":4709},{"style":128},[4710],{"type":57,"value":14},{"type":52,"tag":121,"props":4712,"children":4713},{"style":133},[4714],{"type":57,"value":619},{"type":52,"tag":121,"props":4716,"children":4717},{"style":133},[4718],{"type":57,"value":4665},{"type":52,"tag":121,"props":4720,"children":4721},{"style":133},[4722],{"type":57,"value":4723}," stop",{"type":52,"tag":121,"props":4725,"children":4726},{"style":133},[4727],{"type":57,"value":4728}," accelerometer\n",{"type":52,"tag":121,"props":4730,"children":4731},{"class":123,"line":1008},[4732],{"type":52,"tag":121,"props":4733,"children":4734},{"emptyLinePlaceholder":994},[4735],{"type":57,"value":997},{"type":52,"tag":121,"props":4737,"children":4738},{"class":123,"line":1065},[4739],{"type":52,"tag":121,"props":4740,"children":4741},{"style":217},[4742],{"type":57,"value":4743},"# Stream readings to stdout (JSONL)\n",{"type":52,"tag":121,"props":4745,"children":4746},{"class":123,"line":1228},[4747,4751,4755,4759,4764,4768],{"type":52,"tag":121,"props":4748,"children":4749},{"style":128},[4750],{"type":57,"value":14},{"type":52,"tag":121,"props":4752,"children":4753},{"style":133},[4754],{"type":57,"value":619},{"type":52,"tag":121,"props":4756,"children":4757},{"style":133},[4758],{"type":57,"value":4665},{"type":52,"tag":121,"props":4760,"children":4761},{"style":133},[4762],{"type":57,"value":4763}," stream",{"type":52,"tag":121,"props":4765,"children":4766},{"style":133},[4767],{"type":57,"value":4698},{"type":52,"tag":121,"props":4769,"children":4770},{"style":217},[4771],{"type":57,"value":4772},"          # Ctrl+C to stop\n",{"type":52,"tag":121,"props":4774,"children":4775},{"class":123,"line":1578},[4776,4780,4784,4788,4792,4797,4802,4807],{"type":52,"tag":121,"props":4777,"children":4778},{"style":128},[4779],{"type":57,"value":14},{"type":52,"tag":121,"props":4781,"children":4782},{"style":133},[4783],{"type":57,"value":619},{"type":52,"tag":121,"props":4785,"children":4786},{"style":133},[4787],{"type":57,"value":4665},{"type":52,"tag":121,"props":4789,"children":4790},{"style":133},[4791],{"type":57,"value":4763},{"type":52,"tag":121,"props":4793,"children":4794},{"style":133},[4795],{"type":57,"value":4796}," gyroscope",{"type":52,"tag":121,"props":4798,"children":4799},{"style":133},[4800],{"type":57,"value":4801}," --speed",{"type":52,"tag":121,"props":4803,"children":4804},{"style":133},[4805],{"type":57,"value":4806}," Game",{"type":52,"tag":121,"props":4808,"children":4809},{"style":217},[4810],{"type":57,"value":4811},"  # higher frequency\n",{"type":52,"tag":121,"props":4813,"children":4814},{"class":123,"line":1587},[4815,4819,4823,4827,4831,4836,4841,4846],{"type":52,"tag":121,"props":4816,"children":4817},{"style":128},[4818],{"type":57,"value":14},{"type":52,"tag":121,"props":4820,"children":4821},{"style":133},[4822],{"type":57,"value":619},{"type":52,"tag":121,"props":4824,"children":4825},{"style":133},[4826],{"type":57,"value":4665},{"type":52,"tag":121,"props":4828,"children":4829},{"style":133},[4830],{"type":57,"value":4763},{"type":52,"tag":121,"props":4832,"children":4833},{"style":133},[4834],{"type":57,"value":4835}," compass",{"type":52,"tag":121,"props":4837,"children":4838},{"style":133},[4839],{"type":57,"value":4840}," --duration",{"type":52,"tag":121,"props":4842,"children":4843},{"style":2665},[4844],{"type":57,"value":4845}," 10",{"type":52,"tag":121,"props":4847,"children":4848},{"style":217},[4849],{"type":57,"value":4850},"  # stop after 10 seconds\n",{"type":52,"tag":60,"props":4852,"children":4853},{},[4854,4856,4862,4863,4869,4870,4876,4877,4883,4884,4890,4891,4897,4899,4905,4907,4913,4914,4920,4921,4927],{"type":57,"value":4855},"Available sensors: ",{"type":52,"tag":66,"props":4857,"children":4859},{"className":4858},[],[4860],{"type":57,"value":4861},"accelerometer",{"type":57,"value":1300},{"type":52,"tag":66,"props":4864,"children":4866},{"className":4865},[],[4867],{"type":57,"value":4868},"barometer",{"type":57,"value":1300},{"type":52,"tag":66,"props":4871,"children":4873},{"className":4872},[],[4874],{"type":57,"value":4875},"compass",{"type":57,"value":1300},{"type":52,"tag":66,"props":4878,"children":4880},{"className":4879},[],[4881],{"type":57,"value":4882},"gyroscope",{"type":57,"value":1300},{"type":52,"tag":66,"props":4885,"children":4887},{"className":4886},[],[4888],{"type":57,"value":4889},"magnetometer",{"type":57,"value":1300},{"type":52,"tag":66,"props":4892,"children":4894},{"className":4893},[],[4895],{"type":57,"value":4896},"orientation",{"type":57,"value":4898},".\nSpeed options: ",{"type":52,"tag":66,"props":4900,"children":4902},{"className":4901},[],[4903],{"type":57,"value":4904},"UI",{"type":57,"value":4906}," (default), ",{"type":52,"tag":66,"props":4908,"children":4910},{"className":4909},[],[4911],{"type":57,"value":4912},"Game",{"type":57,"value":1300},{"type":52,"tag":66,"props":4915,"children":4917},{"className":4916},[],[4918],{"type":57,"value":4919},"Fastest",{"type":57,"value":1300},{"type":52,"tag":66,"props":4922,"children":4924},{"className":4923},[],[4925],{"type":57,"value":4926},"Default",{"type":57,"value":89},{"type":52,"tag":60,"props":4929,"children":4930},{},[4931,4935,4937,4943,4945,4951,4952,4958,4959,4965],{"type":52,"tag":96,"props":4932,"children":4933},{},[4934],{"type":57,"value":3871},{"type":57,"value":4936}," Sensor data uses WebSocket (",{"type":52,"tag":66,"props":4938,"children":4940},{"className":4939},[],[4941],{"type":57,"value":4942},"\u002Fws\u002Fsensors?sensor=\u003Cname>",{"type":57,"value":4944},") for\nreal-time push. Each reading is a JSON object with ",{"type":52,"tag":66,"props":4946,"children":4948},{"className":4947},[],[4949],{"type":57,"value":4950},"sensor",{"type":57,"value":1300},{"type":52,"tag":66,"props":4953,"children":4955},{"className":4954},[],[4956],{"type":57,"value":4957},"timestamp",{"type":57,"value":333},{"type":52,"tag":66,"props":4960,"children":4962},{"className":4961},[],[4963],{"type":57,"value":4964},"data",{"type":57,"value":4966}," fields.",{"type":52,"tag":103,"props":4968,"children":4970},{"id":4969},"command-reference",[4971],{"type":57,"value":4972},"Command Reference",{"type":52,"tag":495,"props":4974,"children":4976},{"id":4975},"maui-devflow-ui-native-agent",[4977],{"type":57,"value":4978},"maui devflow ui (Native Agent)",{"type":52,"tag":60,"props":4980,"children":4981},{},[4982],{"type":57,"value":4983},"Global options (work on any subcommand):",{"type":52,"tag":343,"props":4985,"children":4986},{},[4987,5012,5023,5034],{"type":52,"tag":321,"props":4988,"children":4989},{},[4990,4996,4998,5004,5006],{"type":52,"tag":66,"props":4991,"children":4993},{"className":4992},[],[4994],{"type":57,"value":4995},"--agent-host",{"type":57,"value":4997}," (default localhost), ",{"type":52,"tag":66,"props":4999,"children":5001},{"className":5000},[],[5002],{"type":57,"value":5003},"--agent-port",{"type":57,"value":5005}," (auto-discovered via broker), ",{"type":52,"tag":66,"props":5007,"children":5009},{"className":5008},[],[5010],{"type":57,"value":5011},"--platform",{"type":52,"tag":321,"props":5013,"children":5014},{},[5015,5021],{"type":52,"tag":66,"props":5016,"children":5018},{"className":5017},[],[5019],{"type":57,"value":5020},"--json",{"type":57,"value":5022}," — force JSON output. Auto-enabled when stdout is piped\u002Fredirected (TTY auto-detection).",{"type":52,"tag":321,"props":5024,"children":5025},{},[5026,5032],{"type":52,"tag":66,"props":5027,"children":5029},{"className":5028},[],[5030],{"type":57,"value":5031},"--no-json",{"type":57,"value":5033}," — force human-readable output even when piped.",{"type":52,"tag":321,"props":5035,"children":5036},{},[5037,5039,5045],{"type":57,"value":5038},"Env var: ",{"type":52,"tag":66,"props":5040,"children":5042},{"className":5041},[],[5043],{"type":57,"value":5044},"MAUIDEVFLOW_OUTPUT=json",{"type":57,"value":5046}," for persistent JSON mode.",{"type":52,"tag":60,"props":5048,"children":5049},{},[5050,5055,5057,5063,5065,5071,5072,5078,5079,5085,5086,5092,5094,5099],{"type":52,"tag":96,"props":5051,"children":5052},{},[5053],{"type":57,"value":5054},"Implicit element resolution:",{"type":57,"value":5056}," Commands that take an ",{"type":52,"tag":66,"props":5058,"children":5060},{"className":5059},[],[5061],{"type":57,"value":5062},"\u003CelementId>",{"type":57,"value":5064}," (tap, fill, clear, focus)\nalso accept ",{"type":52,"tag":66,"props":5066,"children":5068},{"className":5067},[],[5069],{"type":57,"value":5070},"--automationId",{"type":57,"value":1300},{"type":52,"tag":66,"props":5073,"children":5075},{"className":5074},[],[5076],{"type":57,"value":5077},"--type",{"type":57,"value":1300},{"type":52,"tag":66,"props":5080,"children":5082},{"className":5081},[],[5083],{"type":57,"value":5084},"--text",{"type":57,"value":1300},{"type":52,"tag":66,"props":5087,"children":5089},{"className":5088},[],[5090],{"type":57,"value":5091},"--index",{"type":57,"value":5093}," to resolve the element in a single\ncall. This eliminates the query→act round-trip. The ",{"type":52,"tag":66,"props":5095,"children":5097},{"className":5096},[],[5098],{"type":57,"value":5062},{"type":57,"value":5100}," argument is optional when\nresolution options are provided.",{"type":52,"tag":60,"props":5102,"children":5103},{},[5104,5109,5111,5117,5118,5124,5126,5132],{"type":52,"tag":96,"props":5105,"children":5106},{},[5107],{"type":57,"value":5108},"Post-action flags:",{"type":57,"value":5110}," tap, fill, clear accept ",{"type":52,"tag":66,"props":5112,"children":5114},{"className":5113},[],[5115],{"type":57,"value":5116},"--and-screenshot [path]",{"type":57,"value":1300},{"type":52,"tag":66,"props":5119,"children":5121},{"className":5120},[],[5122],{"type":57,"value":5123},"--and-tree",{"type":57,"value":5125},",\n",{"type":52,"tag":66,"props":5127,"children":5129},{"className":5128},[],[5130],{"type":57,"value":5131},"--and-tree-depth N",{"type":57,"value":5133}," to return verification data alongside the action result.",{"type":52,"tag":686,"props":5135,"children":5136},{},[5137,5153],{"type":52,"tag":690,"props":5138,"children":5139},{},[5140],{"type":52,"tag":694,"props":5141,"children":5142},{},[5143,5148],{"type":52,"tag":698,"props":5144,"children":5145},{},[5146],{"type":57,"value":5147},"Command",{"type":52,"tag":698,"props":5149,"children":5150},{},[5151],{"type":57,"value":5152},"Description",{"type":52,"tag":722,"props":5154,"children":5155},{},[5156,5173,5206,5246,5263,5280,5297,5314,5331,5348,5389,5406,5423,5440,5470,5511,5528,5561,5578,5595,5612,5629,5646,5663,5680,5697,5714,5731,5748,5765,5782,5799,5816,5833,5850,5867,5884,5901,5918,5935,5952,5969,5986,6003,6020,6037],{"type":52,"tag":694,"props":5157,"children":5158},{},[5159,5168],{"type":52,"tag":729,"props":5160,"children":5161},{},[5162],{"type":52,"tag":66,"props":5163,"children":5165},{"className":5164},[],[5166],{"type":57,"value":5167},"ui status [--window W]",{"type":52,"tag":729,"props":5169,"children":5170},{},[5171],{"type":57,"value":5172},"Agent connection status, platform, app name, window count",{"type":52,"tag":694,"props":5174,"children":5175},{},[5176,5185],{"type":52,"tag":729,"props":5177,"children":5178},{},[5179],{"type":52,"tag":66,"props":5180,"children":5182},{"className":5181},[],[5183],{"type":57,"value":5184},"ui tree [--depth N] [--window W] [--fields F] [--format compact]",{"type":52,"tag":729,"props":5186,"children":5187},{},[5188,5190,5196,5198,5204],{"type":57,"value":5189},"Visual tree. ",{"type":52,"tag":66,"props":5191,"children":5193},{"className":5192},[],[5194],{"type":57,"value":5195},"--fields \"id,type,text\"",{"type":57,"value":5197}," projects specific fields. ",{"type":52,"tag":66,"props":5199,"children":5201},{"className":5200},[],[5202],{"type":57,"value":5203},"--format compact",{"type":57,"value":5205}," returns only id, type, text, automationId, bounds",{"type":52,"tag":694,"props":5207,"children":5208},{},[5209,5218],{"type":52,"tag":729,"props":5210,"children":5211},{},[5212],{"type":52,"tag":66,"props":5213,"children":5215},{"className":5214},[],[5216],{"type":57,"value":5217},"ui query [--type T] [--automationId A] [--text T] [--selector S] [--fields F] [--format compact] [--wait-until exists|gone] [--timeout N]",{"type":52,"tag":729,"props":5219,"children":5220},{},[5221,5223,5229,5231,5237,5238,5244],{"type":57,"value":5222},"Find elements. ",{"type":52,"tag":66,"props":5224,"children":5226},{"className":5225},[],[5227],{"type":57,"value":5228},"--wait-until",{"type":57,"value":5230}," polls until condition met (default 30s timeout). ",{"type":52,"tag":66,"props":5232,"children":5234},{"className":5233},[],[5235],{"type":57,"value":5236},"--fields",{"type":57,"value":373},{"type":52,"tag":66,"props":5239,"children":5241},{"className":5240},[],[5242],{"type":57,"value":5243},"--format",{"type":57,"value":5245}," same as tree",{"type":52,"tag":694,"props":5247,"children":5248},{},[5249,5258],{"type":52,"tag":729,"props":5250,"children":5251},{},[5252],{"type":52,"tag":66,"props":5253,"children":5255},{"className":5254},[],[5256],{"type":57,"value":5257},"ui hittest \u003Cx> \u003Cy> [--window W]",{"type":52,"tag":729,"props":5259,"children":5260},{},[5261],{"type":57,"value":5262},"Find elements at a point (deepest first). Returns IDs, types, bounds",{"type":52,"tag":694,"props":5264,"children":5265},{},[5266,5275],{"type":52,"tag":729,"props":5267,"children":5268},{},[5269],{"type":52,"tag":66,"props":5270,"children":5272},{"className":5271},[],[5273],{"type":57,"value":5274},"ui tap [elementId] [--automationId A] [--type T] [--text T] [--index N] [--and-screenshot [path]] [--and-tree] [--and-tree-depth N]",{"type":52,"tag":729,"props":5276,"children":5277},{},[5278],{"type":57,"value":5279},"Tap element by ID or implicit resolution",{"type":52,"tag":694,"props":5281,"children":5282},{},[5283,5292],{"type":52,"tag":729,"props":5284,"children":5285},{},[5286],{"type":52,"tag":66,"props":5287,"children":5289},{"className":5288},[],[5290],{"type":57,"value":5291},"ui fill [elementId] \u003Ctext> [--automationId A] [--type T] [--text T] [--index N] [--and-screenshot [path]] [--and-tree]",{"type":52,"tag":729,"props":5293,"children":5294},{},[5295],{"type":57,"value":5296},"Fill text into Entry\u002FEditor. elementId optional when using resolution options",{"type":52,"tag":694,"props":5298,"children":5299},{},[5300,5309],{"type":52,"tag":729,"props":5301,"children":5302},{},[5303],{"type":52,"tag":66,"props":5304,"children":5306},{"className":5305},[],[5307],{"type":57,"value":5308},"ui clear [elementId] [--automationId A] [--type T] [--text T] [--index N] [--and-screenshot [path]] [--and-tree]",{"type":52,"tag":729,"props":5310,"children":5311},{},[5312],{"type":57,"value":5313},"Clear text. elementId optional when using resolution options",{"type":52,"tag":694,"props":5315,"children":5316},{},[5317,5326],{"type":52,"tag":729,"props":5318,"children":5319},{},[5320],{"type":52,"tag":66,"props":5321,"children":5323},{"className":5322},[],[5324],{"type":57,"value":5325},"MAUI focus [elementId] [--automationId A] [--type T] [--text T] [--index N]",{"type":52,"tag":729,"props":5327,"children":5328},{},[5329],{"type":57,"value":5330},"Set focus. elementId optional when using resolution options",{"type":52,"tag":694,"props":5332,"children":5333},{},[5334,5343],{"type":52,"tag":729,"props":5335,"children":5336},{},[5337],{"type":52,"tag":66,"props":5338,"children":5340},{"className":5339},[],[5341],{"type":57,"value":5342},"MAUI assert [--id ID] [--automationId A] \u003Cproperty> \u003Cexpected>",{"type":52,"tag":729,"props":5344,"children":5345},{},[5346],{"type":57,"value":5347},"Assert element property value. Exit 0 if match, 1 if mismatch. Ideal for verification without screenshots",{"type":52,"tag":694,"props":5349,"children":5350},{},[5351,5360],{"type":52,"tag":729,"props":5352,"children":5353},{},[5354],{"type":52,"tag":66,"props":5355,"children":5357},{"className":5356},[],[5358],{"type":57,"value":5359},"MAUI screenshot [--output path.png] [--window W] [--id ID] [--selector SEL] [--overwrite] [--max-width N] [--scale native]",{"type":52,"tag":729,"props":5361,"children":5362},{},[5363,5365,5371,5373,5379,5381,5387],{"type":57,"value":5364},"PNG screenshot. Auto-scales to 1x logical resolution on HiDPI displays (2x, 3x). Use ",{"type":52,"tag":66,"props":5366,"children":5368},{"className":5367},[],[5369],{"type":57,"value":5370},"--scale native",{"type":57,"value":5372}," for full resolution. ",{"type":52,"tag":66,"props":5374,"children":5376},{"className":5375},[],[5377],{"type":57,"value":5378},"--max-width N",{"type":57,"value":5380}," overrides auto-scaling with explicit width. ",{"type":52,"tag":66,"props":5382,"children":5384},{"className":5383},[],[5385],{"type":57,"value":5386},"--overwrite",{"type":57,"value":5388}," replaces existing file",{"type":52,"tag":694,"props":5390,"children":5391},{},[5392,5401],{"type":52,"tag":729,"props":5393,"children":5394},{},[5395],{"type":52,"tag":66,"props":5396,"children":5398},{"className":5397},[],[5399],{"type":57,"value":5400},"MAUI property \u003CelementId> \u003Cprop>",{"type":52,"tag":729,"props":5402,"children":5403},{},[5404],{"type":57,"value":5405},"Read property (Text, IsVisible, FontSize, etc.)",{"type":52,"tag":694,"props":5407,"children":5408},{},[5409,5418],{"type":52,"tag":729,"props":5410,"children":5411},{},[5412],{"type":52,"tag":66,"props":5413,"children":5415},{"className":5414},[],[5416],{"type":57,"value":5417},"MAUI set-property \u003CelementId> \u003Cprop> \u003Cvalue>",{"type":52,"tag":729,"props":5419,"children":5420},{},[5421],{"type":57,"value":5422},"Set property (live editing — colors, text, sizes, etc.)",{"type":52,"tag":694,"props":5424,"children":5425},{},[5426,5435],{"type":52,"tag":729,"props":5427,"children":5428},{},[5429],{"type":52,"tag":66,"props":5430,"children":5432},{"className":5431},[],[5433],{"type":57,"value":5434},"MAUI element \u003CelementId>",{"type":52,"tag":729,"props":5436,"children":5437},{},[5438],{"type":57,"value":5439},"Full element JSON (type, bounds, children, etc.)",{"type":52,"tag":694,"props":5441,"children":5442},{},[5443,5452],{"type":52,"tag":729,"props":5444,"children":5445},{},[5446],{"type":52,"tag":66,"props":5447,"children":5449},{"className":5448},[],[5450],{"type":57,"value":5451},"MAUI navigate \u003Croute>",{"type":52,"tag":729,"props":5453,"children":5454},{},[5455,5457,5463,5464,5469],{"type":57,"value":5456},"Shell navigation (e.g. ",{"type":52,"tag":66,"props":5458,"children":5460},{"className":5459},[],[5461],{"type":57,"value":5462},"\u002F\u002Fnative",{"type":57,"value":1300},{"type":52,"tag":66,"props":5465,"children":5467},{"className":5466},[],[5468],{"type":57,"value":3214},{"type":57,"value":3790},{"type":52,"tag":694,"props":5471,"children":5472},{},[5473,5482],{"type":52,"tag":729,"props":5474,"children":5475},{},[5476],{"type":52,"tag":66,"props":5477,"children":5479},{"className":5478},[],[5480],{"type":57,"value":5481},"MAUI scroll [--element id] [--dx N] [--dy N] [--item-index N] [--group-index N] [--position P] [--window W]",{"type":52,"tag":729,"props":5483,"children":5484},{},[5485,5487,5493,5495,5501,5503,5509],{"type":57,"value":5486},"Scroll by delta, item index, or scroll element into view. ",{"type":52,"tag":66,"props":5488,"children":5490},{"className":5489},[],[5491],{"type":57,"value":5492},"--item-index",{"type":57,"value":5494}," scrolls to a specific item in CollectionView\u002FListView (works even for virtualized off-screen items). ",{"type":52,"tag":66,"props":5496,"children":5498},{"className":5497},[],[5499],{"type":57,"value":5500},"--position",{"type":57,"value":5502},": MakeVisible (default), Start, Center, End. Delta scroll (",{"type":52,"tag":66,"props":5504,"children":5506},{"className":5505},[],[5507],{"type":57,"value":5508},"--dy -500",{"type":57,"value":5510},") uses native platform scroll for CollectionView",{"type":52,"tag":694,"props":5512,"children":5513},{},[5514,5523],{"type":52,"tag":729,"props":5515,"children":5516},{},[5517],{"type":52,"tag":66,"props":5518,"children":5520},{"className":5519},[],[5521],{"type":57,"value":5522},"MAUI resize \u003Cwidth> \u003Cheight> [--window W]",{"type":52,"tag":729,"props":5524,"children":5525},{},[5526],{"type":57,"value":5527},"Resize app window. Window is 0-based index; default first window",{"type":52,"tag":694,"props":5529,"children":5530},{},[5531,5540],{"type":52,"tag":729,"props":5532,"children":5533},{},[5534],{"type":52,"tag":66,"props":5535,"children":5537},{"className":5536},[],[5538],{"type":57,"value":5539},"MAUI logs [--limit N] [--skip N] [--source S] [--follow]",{"type":52,"tag":729,"props":5541,"children":5542},{},[5543,5545,5551,5553,5559],{"type":57,"value":5544},"Fetch or stream application logs. ",{"type":52,"tag":66,"props":5546,"children":5548},{"className":5547},[],[5549],{"type":57,"value":5550},"--follow",{"type":57,"value":5552}," \u002F ",{"type":52,"tag":66,"props":5554,"children":5556},{"className":5555},[],[5557],{"type":57,"value":5558},"-f",{"type":57,"value":5560}," streams in real-time (Ctrl+C to stop). Source: native, webview, or omit for all",{"type":52,"tag":694,"props":5562,"children":5563},{},[5564,5573],{"type":52,"tag":729,"props":5565,"children":5566},{},[5567],{"type":52,"tag":66,"props":5568,"children":5570},{"className":5569},[],[5571],{"type":57,"value":5572},"MAUI recording start [--output path] [--timeout 30]",{"type":52,"tag":729,"props":5574,"children":5575},{},[5576],{"type":57,"value":5577},"Start screen recording. Default timeout 30s",{"type":52,"tag":694,"props":5579,"children":5580},{},[5581,5590],{"type":52,"tag":729,"props":5582,"children":5583},{},[5584],{"type":52,"tag":66,"props":5585,"children":5587},{"className":5586},[],[5588],{"type":57,"value":5589},"MAUI recording stop",{"type":52,"tag":729,"props":5591,"children":5592},{},[5593],{"type":57,"value":5594},"Stop active recording and save the video file",{"type":52,"tag":694,"props":5596,"children":5597},{},[5598,5607],{"type":52,"tag":729,"props":5599,"children":5600},{},[5601],{"type":52,"tag":66,"props":5602,"children":5604},{"className":5603},[],[5605],{"type":57,"value":5606},"MAUI recording status",{"type":52,"tag":729,"props":5608,"children":5609},{},[5610],{"type":57,"value":5611},"Check if a recording is currently in progress",{"type":52,"tag":694,"props":5613,"children":5614},{},[5615,5624],{"type":52,"tag":729,"props":5616,"children":5617},{},[5618],{"type":52,"tag":66,"props":5619,"children":5621},{"className":5620},[],[5622],{"type":57,"value":5623},"MAUI network",{"type":52,"tag":729,"props":5625,"children":5626},{},[5627],{"type":57,"value":5628},"Live network monitor — streams HTTP requests in real-time (Ctrl+C to stop)",{"type":52,"tag":694,"props":5630,"children":5631},{},[5632,5641],{"type":52,"tag":729,"props":5633,"children":5634},{},[5635],{"type":52,"tag":66,"props":5636,"children":5638},{"className":5637},[],[5639],{"type":57,"value":5640},"MAUI network list [--host H] [--method M]",{"type":52,"tag":729,"props":5642,"children":5643},{},[5644],{"type":57,"value":5645},"One-shot: dump recent captured HTTP requests",{"type":52,"tag":694,"props":5647,"children":5648},{},[5649,5658],{"type":52,"tag":729,"props":5650,"children":5651},{},[5652],{"type":52,"tag":66,"props":5653,"children":5655},{"className":5654},[],[5656],{"type":57,"value":5657},"MAUI network detail \u003CrequestId>",{"type":52,"tag":729,"props":5659,"children":5660},{},[5661],{"type":57,"value":5662},"Full request\u002Fresponse details: headers, body, timing",{"type":52,"tag":694,"props":5664,"children":5665},{},[5666,5675],{"type":52,"tag":729,"props":5667,"children":5668},{},[5669],{"type":52,"tag":66,"props":5670,"children":5672},{"className":5671},[],[5673],{"type":57,"value":5674},"MAUI network clear",{"type":52,"tag":729,"props":5676,"children":5677},{},[5678],{"type":57,"value":5679},"Clear the captured request buffer",{"type":52,"tag":694,"props":5681,"children":5682},{},[5683,5692],{"type":52,"tag":729,"props":5684,"children":5685},{},[5686],{"type":52,"tag":66,"props":5687,"children":5689},{"className":5688},[],[5690],{"type":57,"value":5691},"MAUI preferences list [--sharedName N]",{"type":52,"tag":729,"props":5693,"children":5694},{},[5695],{"type":57,"value":5696},"List all known preference keys and values",{"type":52,"tag":694,"props":5698,"children":5699},{},[5700,5709],{"type":52,"tag":729,"props":5701,"children":5702},{},[5703],{"type":52,"tag":66,"props":5704,"children":5706},{"className":5705},[],[5707],{"type":57,"value":5708},"MAUI preferences get \u003Ckey> [--type T] [--sharedName N]",{"type":52,"tag":729,"props":5710,"children":5711},{},[5712],{"type":57,"value":5713},"Get a preference value. Types: string, int, bool, double, float, long, datetime",{"type":52,"tag":694,"props":5715,"children":5716},{},[5717,5726],{"type":52,"tag":729,"props":5718,"children":5719},{},[5720],{"type":52,"tag":66,"props":5721,"children":5723},{"className":5722},[],[5724],{"type":57,"value":5725},"MAUI preferences set \u003Ckey> \u003Cvalue> [--type T] [--sharedName N]",{"type":52,"tag":729,"props":5727,"children":5728},{},[5729],{"type":57,"value":5730},"Set a preference value",{"type":52,"tag":694,"props":5732,"children":5733},{},[5734,5743],{"type":52,"tag":729,"props":5735,"children":5736},{},[5737],{"type":52,"tag":66,"props":5738,"children":5740},{"className":5739},[],[5741],{"type":57,"value":5742},"MAUI preferences delete \u003Ckey> [--sharedName N]",{"type":52,"tag":729,"props":5744,"children":5745},{},[5746],{"type":57,"value":5747},"Remove a preference",{"type":52,"tag":694,"props":5749,"children":5750},{},[5751,5760],{"type":52,"tag":729,"props":5752,"children":5753},{},[5754],{"type":52,"tag":66,"props":5755,"children":5757},{"className":5756},[],[5758],{"type":57,"value":5759},"MAUI preferences clear [--sharedName N]",{"type":52,"tag":729,"props":5761,"children":5762},{},[5763],{"type":57,"value":5764},"Clear all preferences",{"type":52,"tag":694,"props":5766,"children":5767},{},[5768,5777],{"type":52,"tag":729,"props":5769,"children":5770},{},[5771],{"type":52,"tag":66,"props":5772,"children":5774},{"className":5773},[],[5775],{"type":57,"value":5776},"MAUI secure-storage get \u003Ckey>",{"type":52,"tag":729,"props":5778,"children":5779},{},[5780],{"type":57,"value":5781},"Get a secure storage value",{"type":52,"tag":694,"props":5783,"children":5784},{},[5785,5794],{"type":52,"tag":729,"props":5786,"children":5787},{},[5788],{"type":52,"tag":66,"props":5789,"children":5791},{"className":5790},[],[5792],{"type":57,"value":5793},"MAUI secure-storage set \u003Ckey> \u003Cvalue>",{"type":52,"tag":729,"props":5795,"children":5796},{},[5797],{"type":57,"value":5798},"Set a secure storage value",{"type":52,"tag":694,"props":5800,"children":5801},{},[5802,5811],{"type":52,"tag":729,"props":5803,"children":5804},{},[5805],{"type":52,"tag":66,"props":5806,"children":5808},{"className":5807},[],[5809],{"type":57,"value":5810},"MAUI secure-storage delete \u003Ckey>",{"type":52,"tag":729,"props":5812,"children":5813},{},[5814],{"type":57,"value":5815},"Remove a secure storage entry",{"type":52,"tag":694,"props":5817,"children":5818},{},[5819,5828],{"type":52,"tag":729,"props":5820,"children":5821},{},[5822],{"type":52,"tag":66,"props":5823,"children":5825},{"className":5824},[],[5826],{"type":57,"value":5827},"MAUI secure-storage clear",{"type":52,"tag":729,"props":5829,"children":5830},{},[5831],{"type":57,"value":5832},"Clear all secure storage entries",{"type":52,"tag":694,"props":5834,"children":5835},{},[5836,5845],{"type":52,"tag":729,"props":5837,"children":5838},{},[5839],{"type":52,"tag":66,"props":5840,"children":5842},{"className":5841},[],[5843],{"type":57,"value":5844},"MAUI platform app-info",{"type":52,"tag":729,"props":5846,"children":5847},{},[5848],{"type":57,"value":5849},"App name, version, build, package, theme",{"type":52,"tag":694,"props":5851,"children":5852},{},[5853,5862],{"type":52,"tag":729,"props":5854,"children":5855},{},[5856],{"type":52,"tag":66,"props":5857,"children":5859},{"className":5858},[],[5860],{"type":57,"value":5861},"MAUI platform device-info",{"type":52,"tag":729,"props":5863,"children":5864},{},[5865],{"type":57,"value":5866},"Device manufacturer, model, OS, idiom",{"type":52,"tag":694,"props":5868,"children":5869},{},[5870,5879],{"type":52,"tag":729,"props":5871,"children":5872},{},[5873],{"type":52,"tag":66,"props":5874,"children":5876},{"className":5875},[],[5877],{"type":57,"value":5878},"MAUI platform display",{"type":52,"tag":729,"props":5880,"children":5881},{},[5882],{"type":57,"value":5883},"Screen density, size, orientation, refresh rate",{"type":52,"tag":694,"props":5885,"children":5886},{},[5887,5896],{"type":52,"tag":729,"props":5888,"children":5889},{},[5890],{"type":52,"tag":66,"props":5891,"children":5893},{"className":5892},[],[5894],{"type":57,"value":5895},"MAUI platform battery",{"type":52,"tag":729,"props":5897,"children":5898},{},[5899],{"type":57,"value":5900},"Battery level, state, power source",{"type":52,"tag":694,"props":5902,"children":5903},{},[5904,5913],{"type":52,"tag":729,"props":5905,"children":5906},{},[5907],{"type":52,"tag":66,"props":5908,"children":5910},{"className":5909},[],[5911],{"type":57,"value":5912},"MAUI platform connectivity",{"type":52,"tag":729,"props":5914,"children":5915},{},[5916],{"type":57,"value":5917},"Network access and connection profiles",{"type":52,"tag":694,"props":5919,"children":5920},{},[5921,5930],{"type":52,"tag":729,"props":5922,"children":5923},{},[5924],{"type":52,"tag":66,"props":5925,"children":5927},{"className":5926},[],[5928],{"type":57,"value":5929},"MAUI platform version-tracking",{"type":52,"tag":729,"props":5931,"children":5932},{},[5933],{"type":57,"value":5934},"Current\u002Fprevious\u002Ffirst version, build history, isFirstLaunch",{"type":52,"tag":694,"props":5936,"children":5937},{},[5938,5947],{"type":52,"tag":729,"props":5939,"children":5940},{},[5941],{"type":52,"tag":66,"props":5942,"children":5944},{"className":5943},[],[5945],{"type":57,"value":5946},"MAUI platform permissions [name]",{"type":52,"tag":729,"props":5948,"children":5949},{},[5950],{"type":57,"value":5951},"Check permission status. Omit name to check all common permissions",{"type":52,"tag":694,"props":5953,"children":5954},{},[5955,5964],{"type":52,"tag":729,"props":5956,"children":5957},{},[5958],{"type":52,"tag":66,"props":5959,"children":5961},{"className":5960},[],[5962],{"type":57,"value":5963},"MAUI platform geolocation [--accuracy A] [--timeout N]",{"type":52,"tag":729,"props":5965,"children":5966},{},[5967],{"type":57,"value":5968},"Get current GPS coordinates. Accuracy: Lowest, Low, Medium (default), High, Best",{"type":52,"tag":694,"props":5970,"children":5971},{},[5972,5981],{"type":52,"tag":729,"props":5973,"children":5974},{},[5975],{"type":52,"tag":66,"props":5976,"children":5978},{"className":5977},[],[5979],{"type":57,"value":5980},"MAUI sensors list",{"type":52,"tag":729,"props":5982,"children":5983},{},[5984],{"type":57,"value":5985},"List available sensors and their current state (started\u002Fstopped)",{"type":52,"tag":694,"props":5987,"children":5988},{},[5989,5998],{"type":52,"tag":729,"props":5990,"children":5991},{},[5992],{"type":52,"tag":66,"props":5993,"children":5995},{"className":5994},[],[5996],{"type":57,"value":5997},"MAUI sensors start \u003Csensor> [--speed S]",{"type":52,"tag":729,"props":5999,"children":6000},{},[6001],{"type":57,"value":6002},"Start a sensor. Sensors: accelerometer, barometer, compass, gyroscope, magnetometer, orientation. Speed: UI (default), Game, Fastest, Default",{"type":52,"tag":694,"props":6004,"children":6005},{},[6006,6015],{"type":52,"tag":729,"props":6007,"children":6008},{},[6009],{"type":52,"tag":66,"props":6010,"children":6012},{"className":6011},[],[6013],{"type":57,"value":6014},"MAUI sensors stop \u003Csensor>",{"type":52,"tag":729,"props":6016,"children":6017},{},[6018],{"type":57,"value":6019},"Stop a sensor",{"type":52,"tag":694,"props":6021,"children":6022},{},[6023,6032],{"type":52,"tag":729,"props":6024,"children":6025},{},[6026],{"type":52,"tag":66,"props":6027,"children":6029},{"className":6028},[],[6030],{"type":57,"value":6031},"MAUI sensors stream \u003Csensor> [--speed S] [--duration N]",{"type":52,"tag":729,"props":6033,"children":6034},{},[6035],{"type":57,"value":6036},"Stream sensor readings via WebSocket. Duration 0 = indefinite (Ctrl+C to stop)",{"type":52,"tag":694,"props":6038,"children":6039},{},[6040,6049],{"type":52,"tag":729,"props":6041,"children":6042},{},[6043],{"type":52,"tag":66,"props":6044,"children":6046},{"className":6045},[],[6047],{"type":57,"value":6048},"commands [--json]",{"type":52,"tag":729,"props":6050,"children":6051},{},[6052,6054,6059],{"type":57,"value":6053},"List all available commands with descriptions. ",{"type":52,"tag":66,"props":6055,"children":6057},{"className":6056},[],[6058],{"type":57,"value":5020},{"type":57,"value":6060}," returns machine-readable schema with command names, descriptions, and whether they mutate state",{"type":52,"tag":60,"props":6062,"children":6063},{},[6064,6066,6072,6074,6080,6082,6088,6089,6095,6096,6102],{"type":57,"value":6065},"Element IDs come from ",{"type":52,"tag":66,"props":6067,"children":6069},{"className":6068},[],[6070],{"type":57,"value":6071},"MAUI tree",{"type":57,"value":6073}," or ",{"type":52,"tag":66,"props":6075,"children":6077},{"className":6076},[],[6078],{"type":57,"value":6079},"MAUI query",{"type":57,"value":6081},". AutomationId-based elements use their\nAutomationId directly. Others use generated hex IDs. When multiple elements share the same\nAutomationId, suffixes are appended: ",{"type":52,"tag":66,"props":6083,"children":6085},{"className":6084},[],[6086],{"type":57,"value":6087},"TodoCheckBox",{"type":57,"value":1300},{"type":52,"tag":66,"props":6090,"children":6092},{"className":6091},[],[6093],{"type":57,"value":6094},"TodoCheckBox_1",{"type":57,"value":1300},{"type":52,"tag":66,"props":6097,"children":6099},{"className":6098},[],[6100],{"type":57,"value":6101},"TodoCheckBox_2",{"type":57,"value":1308},{"type":52,"tag":60,"props":6104,"children":6105},{},[6106,6111,6113,6118],{"type":52,"tag":96,"props":6107,"children":6108},{},[6109],{"type":57,"value":6110},"Element ID lifecycle:",{"type":57,"value":6112}," IDs are ephemeral — they're regenerated on each tree walk. After\nnavigation, page changes, or significant UI updates, re-query to get fresh IDs. AutomationIds\nare stable across rebuilds (they come from XAML), so prefer ",{"type":52,"tag":66,"props":6114,"children":6116},{"className":6115},[],[6117],{"type":57,"value":5070},{"type":57,"value":6119}," for scripted flows.",{"type":52,"tag":495,"props":6121,"children":6123},{"id":6122},"maui-devflow-webview-blazor-webview-cdp",[6124],{"type":57,"value":6125},"maui devflow webview (Blazor WebView CDP)",{"type":52,"tag":60,"props":6127,"children":6128},{},[6129,6131,6136,6137,6142,6144,6150,6151,6157],{"type":57,"value":6130},"Global options: ",{"type":52,"tag":66,"props":6132,"children":6134},{"className":6133},[],[6135],{"type":57,"value":4995},{"type":57,"value":4997},{"type":52,"tag":66,"props":6138,"children":6140},{"className":6139},[],[6141],{"type":57,"value":5003},{"type":57,"value":6143}," (auto-discovered via broker).\nCDP commands use the same agent port — all communication goes through a single port.\nUse ",{"type":52,"tag":66,"props":6145,"children":6147},{"className":6146},[],[6148],{"type":57,"value":6149},"--webview \u003Cid>",{"type":57,"value":2567},{"type":52,"tag":66,"props":6152,"children":6154},{"className":6153},[],[6155],{"type":57,"value":6156},"-w \u003Cid>",{"type":57,"value":6158},") on any CDP command to target a specific WebView\nby index, AutomationId, or element ID. Default: first WebView.",{"type":52,"tag":686,"props":6160,"children":6161},{},[6162,6176],{"type":52,"tag":690,"props":6163,"children":6164},{},[6165],{"type":52,"tag":694,"props":6166,"children":6167},{},[6168,6172],{"type":52,"tag":698,"props":6169,"children":6170},{},[6171],{"type":57,"value":5147},{"type":52,"tag":698,"props":6173,"children":6174},{},[6175],{"type":57,"value":5152},{"type":52,"tag":722,"props":6177,"children":6178},{},[6179,6196,6213,6230,6247,6264,6281,6298,6315,6332,6349,6366,6383,6400,6417,6434],{"type":52,"tag":694,"props":6180,"children":6181},{},[6182,6191],{"type":52,"tag":729,"props":6183,"children":6184},{},[6185],{"type":52,"tag":66,"props":6186,"children":6188},{"className":6187},[],[6189],{"type":57,"value":6190},"cdp status",{"type":52,"tag":729,"props":6192,"children":6193},{},[6194],{"type":57,"value":6195},"CDP connection status and WebView count",{"type":52,"tag":694,"props":6197,"children":6198},{},[6199,6208],{"type":52,"tag":729,"props":6200,"children":6201},{},[6202],{"type":52,"tag":66,"props":6203,"children":6205},{"className":6204},[],[6206],{"type":57,"value":6207},"cdp webviews [--json]",{"type":52,"tag":729,"props":6209,"children":6210},{},[6211],{"type":57,"value":6212},"List available CDP WebViews (index, AutomationId, ready status)",{"type":52,"tag":694,"props":6214,"children":6215},{},[6216,6225],{"type":52,"tag":729,"props":6217,"children":6218},{},[6219],{"type":52,"tag":66,"props":6220,"children":6222},{"className":6221},[],[6223],{"type":57,"value":6224},"cdp snapshot",{"type":52,"tag":729,"props":6226,"children":6227},{},[6228],{"type":57,"value":6229},"Accessible DOM text (best for AI agents)",{"type":52,"tag":694,"props":6231,"children":6232},{},[6233,6242],{"type":52,"tag":729,"props":6234,"children":6235},{},[6236],{"type":52,"tag":66,"props":6237,"children":6239},{"className":6238},[],[6240],{"type":57,"value":6241},"cdp source",{"type":52,"tag":729,"props":6243,"children":6244},{},[6245],{"type":57,"value":6246},"Get full page HTML source",{"type":52,"tag":694,"props":6248,"children":6249},{},[6250,6259],{"type":52,"tag":729,"props":6251,"children":6252},{},[6253],{"type":52,"tag":66,"props":6254,"children":6256},{"className":6255},[],[6257],{"type":57,"value":6258},"cdp Browser getVersion",{"type":52,"tag":729,"props":6260,"children":6261},{},[6262],{"type":57,"value":6263},"Browser\u002FWebView version info",{"type":52,"tag":694,"props":6265,"children":6266},{},[6267,6276],{"type":52,"tag":729,"props":6268,"children":6269},{},[6270],{"type":52,"tag":66,"props":6271,"children":6273},{"className":6272},[],[6274],{"type":57,"value":6275},"cdp Runtime evaluate \u003Cexpr>",{"type":52,"tag":729,"props":6277,"children":6278},{},[6279],{"type":57,"value":6280},"Evaluate JavaScript",{"type":52,"tag":694,"props":6282,"children":6283},{},[6284,6293],{"type":52,"tag":729,"props":6285,"children":6286},{},[6287],{"type":52,"tag":66,"props":6288,"children":6290},{"className":6289},[],[6291],{"type":57,"value":6292},"cdp DOM getDocument",{"type":52,"tag":729,"props":6294,"children":6295},{},[6296],{"type":57,"value":6297},"Full DOM document",{"type":52,"tag":694,"props":6299,"children":6300},{},[6301,6310],{"type":52,"tag":729,"props":6302,"children":6303},{},[6304],{"type":52,"tag":66,"props":6305,"children":6307},{"className":6306},[],[6308],{"type":57,"value":6309},"cdp DOM querySelector \u003Csel>",{"type":52,"tag":729,"props":6311,"children":6312},{},[6313],{"type":57,"value":6314},"Find first matching element",{"type":52,"tag":694,"props":6316,"children":6317},{},[6318,6327],{"type":52,"tag":729,"props":6319,"children":6320},{},[6321],{"type":52,"tag":66,"props":6322,"children":6324},{"className":6323},[],[6325],{"type":57,"value":6326},"cdp DOM querySelectorAll \u003Csel>",{"type":52,"tag":729,"props":6328,"children":6329},{},[6330],{"type":57,"value":6331},"Find all matching elements",{"type":52,"tag":694,"props":6333,"children":6334},{},[6335,6344],{"type":52,"tag":729,"props":6336,"children":6337},{},[6338],{"type":52,"tag":66,"props":6339,"children":6341},{"className":6340},[],[6342],{"type":57,"value":6343},"cdp DOM getOuterHTML \u003Csel>",{"type":52,"tag":729,"props":6345,"children":6346},{},[6347],{"type":57,"value":6348},"Get outer HTML of element",{"type":52,"tag":694,"props":6350,"children":6351},{},[6352,6361],{"type":52,"tag":729,"props":6353,"children":6354},{},[6355],{"type":52,"tag":66,"props":6356,"children":6358},{"className":6357},[],[6359],{"type":57,"value":6360},"cdp Page navigate \u003Curl>",{"type":52,"tag":729,"props":6362,"children":6363},{},[6364],{"type":57,"value":6365},"Navigate to URL",{"type":52,"tag":694,"props":6367,"children":6368},{},[6369,6378],{"type":52,"tag":729,"props":6370,"children":6371},{},[6372],{"type":52,"tag":66,"props":6373,"children":6375},{"className":6374},[],[6376],{"type":57,"value":6377},"cdp Page reload",{"type":52,"tag":729,"props":6379,"children":6380},{},[6381],{"type":57,"value":6382},"Reload page",{"type":52,"tag":694,"props":6384,"children":6385},{},[6386,6395],{"type":52,"tag":729,"props":6387,"children":6388},{},[6389],{"type":52,"tag":66,"props":6390,"children":6392},{"className":6391},[],[6393],{"type":57,"value":6394},"cdp Page captureScreenshot",{"type":52,"tag":729,"props":6396,"children":6397},{},[6398],{"type":57,"value":6399},"Screenshot as base64",{"type":52,"tag":694,"props":6401,"children":6402},{},[6403,6412],{"type":52,"tag":729,"props":6404,"children":6405},{},[6406],{"type":52,"tag":66,"props":6407,"children":6409},{"className":6408},[],[6410],{"type":57,"value":6411},"cdp Input dispatchClickEvent \u003Csel>",{"type":52,"tag":729,"props":6413,"children":6414},{},[6415],{"type":57,"value":6416},"Click element by CSS selector",{"type":52,"tag":694,"props":6418,"children":6419},{},[6420,6429],{"type":52,"tag":729,"props":6421,"children":6422},{},[6423],{"type":52,"tag":66,"props":6424,"children":6426},{"className":6425},[],[6427],{"type":57,"value":6428},"cdp Input insertText \u003Ctext>",{"type":52,"tag":729,"props":6430,"children":6431},{},[6432],{"type":57,"value":6433},"Insert text at focused element",{"type":52,"tag":694,"props":6435,"children":6436},{},[6437,6446],{"type":52,"tag":729,"props":6438,"children":6439},{},[6440],{"type":52,"tag":66,"props":6441,"children":6443},{"className":6442},[],[6444],{"type":57,"value":6445},"cdp Input fill \u003Cselector> \u003Ctext>",{"type":52,"tag":729,"props":6447,"children":6448},{},[6449],{"type":57,"value":6450},"Focus + fill text into element",{"type":52,"tag":60,"props":6452,"children":6453},{},[6454,6459,6461,6467,6469,6475,6477,6483,6484,6490],{"type":52,"tag":96,"props":6455,"children":6456},{},[6457],{"type":57,"value":6458},"Multi-WebView targeting:",{"type":57,"value":6460}," If the app has multiple BlazorWebViews, use ",{"type":52,"tag":66,"props":6462,"children":6464},{"className":6463},[],[6465],{"type":57,"value":6466},"cdp webviews",{"type":57,"value":6468},"\nto list them, then ",{"type":52,"tag":66,"props":6470,"children":6472},{"className":6471},[],[6473],{"type":57,"value":6474},"--webview \u003Cindex-or-automationId>",{"type":57,"value":6476}," on any command to target a specific one.\nExample: ",{"type":52,"tag":66,"props":6478,"children":6480},{"className":6479},[],[6481],{"type":57,"value":6482},"maui devflow webview --webview 1 snapshot",{"type":57,"value":6073},{"type":52,"tag":66,"props":6485,"children":6487},{"className":6486},[],[6488],{"type":57,"value":6489},"maui devflow webview -w MyWebView Runtime evaluate \"1+1\"",{"type":57,"value":89},{"type":52,"tag":495,"props":6492,"children":6494},{"id":6493},"maui-devflow-broker-discovery",[6495],{"type":57,"value":6496},"maui devflow broker & discovery",{"type":52,"tag":60,"props":6498,"children":6499},{},[6500],{"type":57,"value":6501},"The broker is a background daemon that manages port assignments for all running agents.\nThe CLI auto-starts the broker on first use — no manual setup needed.",{"type":52,"tag":686,"props":6503,"children":6504},{},[6505,6519],{"type":52,"tag":690,"props":6506,"children":6507},{},[6508],{"type":52,"tag":694,"props":6509,"children":6510},{},[6511,6515],{"type":52,"tag":698,"props":6512,"children":6513},{},[6514],{"type":57,"value":5147},{"type":52,"tag":698,"props":6516,"children":6517},{},[6518],{"type":57,"value":5152},{"type":52,"tag":722,"props":6520,"children":6521},{},[6522,6538,6569,6586,6603,6620],{"type":52,"tag":694,"props":6523,"children":6524},{},[6525,6533],{"type":52,"tag":729,"props":6526,"children":6527},{},[6528],{"type":52,"tag":66,"props":6529,"children":6531},{"className":6530},[],[6532],{"type":57,"value":713},{"type":52,"tag":729,"props":6534,"children":6535},{},[6536],{"type":57,"value":6537},"Show all registered agents (ID, app, platform, TFM, port, uptime)",{"type":52,"tag":694,"props":6539,"children":6540},{},[6541,6550],{"type":52,"tag":729,"props":6542,"children":6543},{},[6544],{"type":52,"tag":66,"props":6545,"children":6547},{"className":6546},[],[6548],{"type":57,"value":6549},"wait [--timeout 120] [--project path] [--wait-platform P] [--json]",{"type":52,"tag":729,"props":6551,"children":6552},{},[6553,6555,6560,6562,6567],{"type":57,"value":6554},"Wait for an agent to connect. Outputs the port (or JSON with ",{"type":52,"tag":66,"props":6556,"children":6558},{"className":6557},[],[6559],{"type":57,"value":5020},{"type":57,"value":6561},"). Useful after ",{"type":52,"tag":66,"props":6563,"children":6565},{"className":6564},[],[6566],{"type":57,"value":813},{"type":57,"value":6568}," to block until the app is ready",{"type":52,"tag":694,"props":6570,"children":6571},{},[6572,6581],{"type":52,"tag":729,"props":6573,"children":6574},{},[6575],{"type":52,"tag":66,"props":6576,"children":6578},{"className":6577},[],[6579],{"type":57,"value":6580},"broker status",{"type":52,"tag":729,"props":6582,"children":6583},{},[6584],{"type":57,"value":6585},"Broker daemon status and connected agent count",{"type":52,"tag":694,"props":6587,"children":6588},{},[6589,6598],{"type":52,"tag":729,"props":6590,"children":6591},{},[6592],{"type":52,"tag":66,"props":6593,"children":6595},{"className":6594},[],[6596],{"type":57,"value":6597},"broker start",{"type":52,"tag":729,"props":6599,"children":6600},{},[6601],{"type":57,"value":6602},"Start broker daemon (auto-started by CLI — rarely needed manually)",{"type":52,"tag":694,"props":6604,"children":6605},{},[6606,6615],{"type":52,"tag":729,"props":6607,"children":6608},{},[6609],{"type":52,"tag":66,"props":6610,"children":6612},{"className":6611},[],[6613],{"type":57,"value":6614},"broker stop",{"type":52,"tag":729,"props":6616,"children":6617},{},[6618],{"type":57,"value":6619},"Stop broker daemon",{"type":52,"tag":694,"props":6621,"children":6622},{},[6623,6632],{"type":52,"tag":729,"props":6624,"children":6625},{},[6626],{"type":52,"tag":66,"props":6627,"children":6629},{"className":6628},[],[6630],{"type":57,"value":6631},"broker log",{"type":52,"tag":729,"props":6633,"children":6634},{},[6635],{"type":57,"value":6636},"Show broker log file",{"type":52,"tag":495,"props":6638,"children":6640},{"id":6639},"maui-devflow-batch-multi-command-execution",[6641],{"type":57,"value":6642},"maui devflow batch (Multi-Command Execution)",{"type":52,"tag":60,"props":6644,"children":6645},{},[6646],{"type":57,"value":6647},"Execute multiple commands in one invocation via stdin. Returns JSONL responses. Use for\nmulti-step interactions to avoid repeated port resolution.",{"type":52,"tag":110,"props":6649,"children":6651},{"className":112,"code":6650,"language":114,"meta":115,"style":115},"echo \"ui fill textUsername user; ui fill textPassword pwd123; ui tap buttonLogin\" | maui devflow batch\n",[6652],{"type":52,"tag":66,"props":6653,"children":6654},{"__ignoreMap":115},[6655],{"type":52,"tag":121,"props":6656,"children":6657},{"class":123,"line":124},[6658,6664,6668,6673,6677,6681,6686,6690],{"type":52,"tag":121,"props":6659,"children":6661},{"style":6660},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[6662],{"type":57,"value":6663},"echo",{"type":52,"tag":121,"props":6665,"children":6666},{"style":159},[6667],{"type":57,"value":546},{"type":52,"tag":121,"props":6669,"children":6670},{"style":133},[6671],{"type":57,"value":6672},"ui fill textUsername user; ui fill textPassword pwd123; ui tap buttonLogin",{"type":52,"tag":121,"props":6674,"children":6675},{"style":159},[6676],{"type":57,"value":556},{"type":52,"tag":121,"props":6678,"children":6679},{"style":159},[6680],{"type":57,"value":3844},{"type":52,"tag":121,"props":6682,"children":6683},{"style":128},[6684],{"type":57,"value":6685}," maui",{"type":52,"tag":121,"props":6687,"children":6688},{"style":133},[6689],{"type":57,"value":619},{"type":52,"tag":121,"props":6691,"children":6692},{"style":133},[6693],{"type":57,"value":6694}," batch\n",{"type":52,"tag":60,"props":6696,"children":6697},{},[6698,6700,6705],{"type":57,"value":6699},"For full options, JSONL format, and streaming details, see ",{"type":52,"tag":302,"props":6701,"children":6703},{"href":6702},"references\u002Fbatch.md",[6704],{"type":57,"value":6702},{"type":57,"value":89},{"type":52,"tag":103,"props":6707,"children":6709},{"id":6708},"platform-details",[6710],{"type":57,"value":6711},"Platform Details",{"type":52,"tag":60,"props":6713,"children":6714},{},[6715],{"type":57,"value":6716},"For detailed platform-specific setup, simulator\u002Femulator management, and troubleshooting:",{"type":52,"tag":343,"props":6718,"children":6719},{},[6720,6734,6748,6760,6774,6788],{"type":52,"tag":321,"props":6721,"children":6722},{},[6723,6728,6730],{"type":52,"tag":96,"props":6724,"children":6725},{},[6726],{"type":57,"value":6727},"Setup & Installation",{"type":57,"value":6729},": See ",{"type":52,"tag":302,"props":6731,"children":6732},{"href":304},[6733],{"type":57,"value":304},{"type":52,"tag":321,"props":6735,"children":6736},{},[6737,6742,6743],{"type":52,"tag":96,"props":6738,"children":6739},{},[6740],{"type":57,"value":6741},"iOS \u002F Mac Catalyst",{"type":57,"value":6729},{"type":52,"tag":302,"props":6744,"children":6746},{"href":6745},"references\u002Fios-and-mac.md",[6747],{"type":57,"value":6745},{"type":52,"tag":321,"props":6749,"children":6750},{},[6751,6755,6756],{"type":52,"tag":96,"props":6752,"children":6753},{},[6754],{"type":57,"value":1814},{"type":57,"value":6729},{"type":52,"tag":302,"props":6757,"children":6758},{"href":485},[6759],{"type":57,"value":485},{"type":52,"tag":321,"props":6761,"children":6762},{},[6763,6768,6769],{"type":52,"tag":96,"props":6764,"children":6765},{},[6766],{"type":57,"value":6767},"Android",{"type":57,"value":6729},{"type":52,"tag":302,"props":6770,"children":6772},{"href":6771},"references\u002Fandroid.md",[6773],{"type":57,"value":6771},{"type":52,"tag":321,"props":6775,"children":6776},{},[6777,6782,6783],{"type":52,"tag":96,"props":6778,"children":6779},{},[6780],{"type":57,"value":6781},"Linux \u002F GTK",{"type":57,"value":6729},{"type":52,"tag":302,"props":6784,"children":6786},{"href":6785},"references\u002Flinux.md",[6787],{"type":57,"value":6785},{"type":52,"tag":321,"props":6789,"children":6790},{},[6791,6796,6797],{"type":52,"tag":96,"props":6792,"children":6793},{},[6794],{"type":57,"value":6795},"Troubleshooting",{"type":57,"value":6729},{"type":52,"tag":302,"props":6798,"children":6799},{"href":2044},[6800],{"type":57,"value":2044},{"type":52,"tag":103,"props":6802,"children":6804},{"id":6803},"️-non-disruptive-operation",[6805],{"type":57,"value":6806},"⚠️ Non-Disruptive Operation",{"type":52,"tag":60,"props":6808,"children":6809},{},[6810,6815],{"type":52,"tag":96,"props":6811,"children":6812},{},[6813],{"type":57,"value":6814},"CRITICAL:",{"type":57,"value":6816}," Never run commands that steal focus, move windows, simulate mouse\u002Fkeyboard input,\nor otherwise disrupt the user's desktop. The user is likely working on the same computer.",{"type":52,"tag":60,"props":6818,"children":6819},{},[6820,6822,6828,6829,6835,6837,6842],{"type":57,"value":6821},"Some platform reference notes mention ",{"type":52,"tag":66,"props":6823,"children":6825},{"className":6824},[],[6826],{"type":57,"value":6827},"osascript",{"type":57,"value":6073},{"type":52,"tag":66,"props":6830,"children":6832},{"className":6831},[],[6833],{"type":57,"value":6834},"xdotool",{"type":57,"value":6836},". Treat those as ",{"type":52,"tag":96,"props":6838,"children":6839},{},[6840],{"type":57,"value":6841},"implementation\ndetails or explicit-consent edge cases",{"type":57,"value":6843},", not the default debugging workflow.",{"type":52,"tag":60,"props":6845,"children":6846},{},[6847],{"type":52,"tag":96,"props":6848,"children":6849},{},[6850],{"type":57,"value":6851},"Never directly use:",{"type":52,"tag":343,"props":6853,"children":6854},{},[6855,6865,6876,6886,6891],{"type":52,"tag":321,"props":6856,"children":6857},{},[6858,6863],{"type":52,"tag":66,"props":6859,"children":6861},{"className":6860},[],[6862],{"type":57,"value":6827},{"type":57,"value":6864}," to focus\u002Factivate windows, click UI elements, send keystrokes, or change host macOS appearance without the user's approval",{"type":52,"tag":321,"props":6866,"children":6867},{},[6868,6874],{"type":52,"tag":66,"props":6869,"children":6871},{"className":6870},[],[6872],{"type":57,"value":6873},"screencapture",{"type":57,"value":6875}," interactively (the MauiDevFlow screenshot command captures in-process instead)",{"type":52,"tag":321,"props":6877,"children":6878},{},[6879,6884],{"type":52,"tag":66,"props":6880,"children":6882},{"className":6881},[],[6883],{"type":57,"value":6834},{"type":57,"value":6885}," focus\u002Factivate\u002Fkey commands from the shell that affect the active window",{"type":52,"tag":321,"props":6887,"children":6888},{},[6889],{"type":57,"value":6890},"Any command that moves the mouse cursor or simulates input at the OS level",{"type":52,"tag":321,"props":6892,"children":6893},{},[6894,6900,6902,6907],{"type":52,"tag":66,"props":6895,"children":6897},{"className":6896},[],[6898],{"type":57,"value":6899},"open -a",{"type":57,"value":6901}," to bring apps to the foreground (use ",{"type":52,"tag":66,"props":6903,"children":6905},{"className":6904},[],[6906],{"type":57,"value":1682},{"type":57,"value":6908}," only to launch, not to focus)",{"type":52,"tag":60,"props":6910,"children":6911},{},[6912,6917,6919,6925,6927,6933,6934,6940,6942,6948,6950,6955],{"type":52,"tag":96,"props":6913,"children":6914},{},[6915],{"type":57,"value":6916},"Instead:",{"type":57,"value":6918}," All inspection and interaction goes through ",{"type":52,"tag":66,"props":6920,"children":6922},{"className":6921},[],[6923],{"type":57,"value":6924},"maui devflow",{"type":57,"value":6926}," CLI commands, which\ncommunicate with the in-app agent over HTTP — no foreground focus required. Simulator-scoped\ncommands such as ",{"type":52,"tag":66,"props":6928,"children":6930},{"className":6929},[],[6931],{"type":57,"value":6932},"xcrun simctl privacy",{"type":57,"value":1300},{"type":52,"tag":66,"props":6935,"children":6937},{"className":6936},[],[6938],{"type":57,"value":6939},"xcrun simctl ui \u003CUDID> appearance ...",{"type":57,"value":6941},", and\n",{"type":52,"tag":66,"props":6943,"children":6945},{"className":6944},[],[6946],{"type":57,"value":6947},"xcrun simctl io screenshot",{"type":57,"value":6949}," are fine because they target the simulator rather than the user's\ndesktop. If recovery requires OS-level control outside the app, ",{"type":52,"tag":96,"props":6951,"children":6952},{},[6953],{"type":57,"value":6954},"ask the user",{"type":57,"value":6956}," to do it\nmanually or get explicit approval before making a disruptive host-level change.",{"type":52,"tag":103,"props":6958,"children":6960},{"id":6959},"tips",[6961],{"type":57,"value":6962},"Tips",{"type":52,"tag":343,"props":6964,"children":6965},{},[6966,6989,7002,7014,7035,7051,7062,7074,7085,7103,7120],{"type":52,"tag":321,"props":6967,"children":6968},{},[6969,6979,6981,6987],{"type":52,"tag":96,"props":6970,"children":6971},{},[6972,6977],{"type":52,"tag":66,"props":6973,"children":6975},{"className":6974},[],[6976],{"type":57,"value":590},{"type":57,"value":6978}," shows runtime state, not project integration.",{"type":57,"value":6980}," Empty list ≠ \"not installed.\"\nAlways check project files (",{"type":52,"tag":66,"props":6982,"children":6984},{"className":6983},[],[6985],{"type":57,"value":6986},"grep -rl \"MauiDevFlow\" --include=\"*.csproj\" .",{"type":57,"value":6988},") before concluding DevFlow is unavailable.",{"type":52,"tag":321,"props":6990,"children":6991},{},[6992,7000],{"type":52,"tag":96,"props":6993,"children":6994},{},[6995],{"type":52,"tag":66,"props":6996,"children":6998},{"className":6997},[],[6999],{"type":57,"value":1926},{"type":57,"value":7001}," is the fastest way to check the entire chain: CLI → broker → agents → projects.",{"type":52,"tag":321,"props":7003,"children":7004},{},[7005,7007,7012],{"type":57,"value":7006},"After launching through Aspire, always run ",{"type":52,"tag":66,"props":7008,"children":7010},{"className":7009},[],[7011],{"type":57,"value":765},{"type":57,"value":7013}," before attempting any interaction.",{"type":52,"tag":321,"props":7015,"children":7016},{},[7017,7028,7030,7034],{"type":52,"tag":96,"props":7018,"children":7019},{},[7020,7022],{"type":57,"value":7021},"Use ",{"type":52,"tag":66,"props":7023,"children":7025},{"className":7024},[],[7026],{"type":57,"value":7027},"maui devflow batch",{"type":57,"value":7029}," for multi-step interactions — resolves port once, adds delays,\nreturns structured JSONL. See ",{"type":52,"tag":302,"props":7031,"children":7032},{"href":6702},[7033],{"type":57,"value":6702},{"type":57,"value":89},{"type":52,"tag":321,"props":7036,"children":7037},{},[7038,7049],{"type":52,"tag":96,"props":7039,"children":7040},{},[7041,7043],{"type":57,"value":7042},"Always use ",{"type":52,"tag":66,"props":7044,"children":7046},{"className":7045},[],[7047],{"type":57,"value":7048},"maui devflow ui screenshot",{"type":57,"value":7050}," — captures in-process, app does NOT need\nforeground focus.",{"type":52,"tag":321,"props":7052,"children":7053},{},[7054,7055,7060],{"type":57,"value":7021},{"type":52,"tag":66,"props":7056,"children":7058},{"className":7057},[],[7059],{"type":57,"value":2549},{"type":57,"value":7061}," on important MAUI controls for stable element references.",{"type":52,"tag":321,"props":7063,"children":7064},{},[7065,7067,7072],{"type":57,"value":7066},"For Blazor Hybrid, ",{"type":52,"tag":66,"props":7068,"children":7070},{"className":7069},[],[7071],{"type":57,"value":6224},{"type":57,"value":7073}," is the most AI-friendly way to read page state.",{"type":52,"tag":321,"props":7075,"children":7076},{},[7077,7079,7084],{"type":57,"value":7078},"Port discovery, multi-project setup, and custom ports: see ",{"type":52,"tag":302,"props":7080,"children":7082},{"href":7081},"references\u002Fsetup.md#3b-port-configuration",[7083],{"type":57,"value":304},{"type":57,"value":89},{"type":52,"tag":321,"props":7086,"children":7087},{},[7088,7093,7095,7101],{"type":52,"tag":96,"props":7089,"children":7090},{},[7091],{"type":57,"value":7092},"Shell apps:",{"type":57,"value":7094}," Read ",{"type":52,"tag":66,"props":7096,"children":7098},{"className":7097},[],[7099],{"type":57,"value":7100},"AppShell.xaml",{"type":57,"value":7102}," to discover routes before navigating. Routes are\ncase-sensitive and often lowercase.",{"type":52,"tag":321,"props":7104,"children":7105},{},[7106,7111,7113,7118],{"type":52,"tag":96,"props":7107,"children":7108},{},[7109],{"type":57,"value":7110},"CollectionView items:",{"type":57,"value":7112}," Tap the container Grid\u002FStackLayout, not inner Labels\u002FImages.\nUse ",{"type":52,"tag":66,"props":7114,"children":7116},{"className":7115},[],[7117],{"type":57,"value":5492},{"type":57,"value":7119}," to scroll to off-screen items.",{"type":52,"tag":321,"props":7121,"children":7122},{},[7123,7135,7137,7143],{"type":52,"tag":96,"props":7124,"children":7125},{},[7126,7128,7133],{"type":57,"value":7127},"Ambiguous ",{"type":52,"tag":66,"props":7129,"children":7131},{"className":7130},[],[7132],{"type":57,"value":5084},{"type":57,"value":7134},":",{"type":57,"value":7136}," When text appears on multiple pages, use explicit IDs from ",{"type":52,"tag":66,"props":7138,"children":7140},{"className":7139},[],[7141],{"type":57,"value":7142},"tree",{"type":57,"value":89},{"type":52,"tag":103,"props":7145,"children":7147},{"id":7146},"ai-agent-best-practices",[7148],{"type":57,"value":7149},"AI Agent Best Practices",{"type":52,"tag":495,"props":7151,"children":7153},{"id":7152},"output-format",[7154],{"type":57,"value":7155},"Output Format",{"type":52,"tag":343,"props":7157,"children":7158},{},[7159,7173,7185,7196,7208],{"type":52,"tag":321,"props":7160,"children":7161},{},[7162,7171],{"type":52,"tag":96,"props":7163,"children":7164},{},[7165,7166],{"type":57,"value":7042},{"type":52,"tag":66,"props":7167,"children":7169},{"className":7168},[],[7170],{"type":57,"value":5020},{"type":57,"value":7172}," or rely on TTY auto-detection (JSON is auto-enabled when stdout is piped\u002Fredirected).",{"type":52,"tag":321,"props":7174,"children":7175},{},[7176,7178,7183],{"type":57,"value":7177},"Set ",{"type":52,"tag":66,"props":7179,"children":7181},{"className":7180},[],[7182],{"type":57,"value":5044},{"type":57,"value":7184}," in your environment for consistent machine-readable output.",{"type":52,"tag":321,"props":7186,"children":7187},{},[7188,7189,7194],{"type":57,"value":7021},{"type":52,"tag":66,"props":7190,"children":7192},{"className":7191},[],[7193],{"type":57,"value":5031},{"type":57,"value":7195}," only when you specifically need human-readable output in a pipe.",{"type":52,"tag":321,"props":7197,"children":7198},{},[7199,7201,7207],{"type":57,"value":7200},"Errors go to stderr as structured JSON: ",{"type":52,"tag":66,"props":7202,"children":7204},{"className":7203},[],[7205],{"type":57,"value":7206},"{\"error\": \"...\", \"type\": \"RuntimeError\", \"retryable\": false, \"suggestions\": [...]}",{"type":57,"value":89},{"type":52,"tag":321,"props":7209,"children":7210},{},[7211],{"type":57,"value":7212},"Check exit codes: 0 = success, non-zero = failure.",{"type":52,"tag":495,"props":7214,"children":7216},{"id":7215},"reducing-token-usage",[7217],{"type":57,"value":7218},"Reducing Token Usage",{"type":52,"tag":343,"props":7220,"children":7221},{},[7222,7258,7273,7287,7303],{"type":52,"tag":321,"props":7223,"children":7224},{},[7225,7235,7237,7242,7244,7249,7251,7256],{"type":52,"tag":96,"props":7226,"children":7227},{},[7228,7229],{"type":57,"value":7021},{"type":52,"tag":66,"props":7230,"children":7232},{"className":7231},[],[7233],{"type":57,"value":7234},"--depth 15",{"type":57,"value":7236}," (or higher) for ",{"type":52,"tag":66,"props":7238,"children":7240},{"className":7239},[],[7241],{"type":57,"value":6071},{"type":57,"value":7243}," — MAUI visual trees are deeply nested (a simple\ncontrol is often at depth 10-15). Start with ",{"type":52,"tag":66,"props":7245,"children":7247},{"className":7246},[],[7248],{"type":57,"value":7234},{"type":57,"value":7250},"; if you see truncated children, increase.\nAfter your first successful tree dump, note the depth where meaningful controls appear and reuse\nthat depth for subsequent calls. If the tree is still too large, combine with ",{"type":52,"tag":66,"props":7252,"children":7254},{"className":7253},[],[7255],{"type":57,"value":5236},{"type":57,"value":7257}," to reduce width.",{"type":52,"tag":321,"props":7259,"children":7260},{},[7261,7262,7271],{"type":57,"value":7021},{"type":52,"tag":96,"props":7263,"children":7264},{},[7265],{"type":52,"tag":66,"props":7266,"children":7268},{"className":7267},[],[7269],{"type":57,"value":7270},"--fields \"id,type,text,automationId\"",{"type":57,"value":7272}," to project only the fields you need.",{"type":52,"tag":321,"props":7274,"children":7275},{},[7276,7277,7285],{"type":57,"value":7021},{"type":52,"tag":96,"props":7278,"children":7279},{},[7280],{"type":52,"tag":66,"props":7281,"children":7283},{"className":7282},[],[7284],{"type":57,"value":5203},{"type":57,"value":7286}," for minimal tree output (id, type, text, automationId, bounds).",{"type":52,"tag":321,"props":7288,"children":7289},{},[7290,7301],{"type":52,"tag":96,"props":7291,"children":7292},{},[7293,7295],{"type":57,"value":7294},"Prefer ",{"type":52,"tag":66,"props":7296,"children":7298},{"className":7297},[],[7299],{"type":57,"value":7300},"MAUI query --automationId",{"type":57,"value":7302}," over full tree traversal — much smaller response.",{"type":52,"tag":321,"props":7304,"children":7305},{},[7306,7307,7312,7314,7320],{"type":57,"value":7021},{"type":52,"tag":96,"props":7308,"children":7309},{},[7310],{"type":57,"value":7311},"element-level screenshots",{"type":57,"value":7313}," (",{"type":52,"tag":66,"props":7315,"children":7317},{"className":7316},[],[7318],{"type":57,"value":7319},"--id \u003CelementId>",{"type":57,"value":7321},") when you only need to see one control.",{"type":52,"tag":495,"props":7323,"children":7325},{"id":7324},"adaptive-depth-learning",[7326],{"type":57,"value":7327},"Adaptive Depth Learning",{"type":52,"tag":60,"props":7329,"children":7330},{},[7331,7333,7338],{"type":57,"value":7332},"MAUI app trees vary in depth — a simple app might have controls at depth 8, while a complex app\nwith Shell + NavigationPage + nested layouts might need depth 20+. After your first ",{"type":52,"tag":66,"props":7334,"children":7336},{"className":7335},[],[7337],{"type":57,"value":6071},{"type":57,"value":7339},"\ncall, look at where the leaf-level controls (Button, Entry, Label) appear and remember that depth.\nUse it for all subsequent tree calls in the same session. If you navigate to a new page that seems\ndeeper, bump the depth up. This avoids both truncating useful content and wasting tokens on\nexcessively deep dumps.",{"type":52,"tag":495,"props":7341,"children":7343},{"id":7342},"screenshot-auto-scaling-hidpi",[7344],{"type":57,"value":7345},"Screenshot Auto-Scaling (HiDPI)",{"type":52,"tag":60,"props":7347,"children":7348},{},[7349,7351,7356],{"type":57,"value":7350},"Screenshots are ",{"type":52,"tag":96,"props":7352,"children":7353},{},[7354],{"type":57,"value":7355},"automatically scaled to 1x logical resolution",{"type":57,"value":7357}," by default. The agent detects\nthe device's display density (2x on Retina, 3x on iPhone Pro Max, 1x on desktop) and divides\nthe screenshot dimensions accordingly. This happens server-side before transfer.",{"type":52,"tag":343,"props":7359,"children":7360},{},[7361,7378,7441],{"type":52,"tag":321,"props":7362,"children":7363},{},[7364,7369,7371,7376],{"type":52,"tag":96,"props":7365,"children":7366},{},[7367],{"type":57,"value":7368},"No action needed",{"type":57,"value":7370}," — just use ",{"type":52,"tag":66,"props":7372,"children":7374},{"className":7373},[],[7375],{"type":57,"value":2140},{"type":57,"value":7377}," and the\nimage will be appropriately sized for AI understanding.",{"type":52,"tag":321,"props":7379,"children":7380},{},[7381,7386,7388,7393,7395],{"type":52,"tag":96,"props":7382,"children":7383},{},[7384],{"type":57,"value":7385},"Full resolution:",{"type":57,"value":7387}," Use ",{"type":52,"tag":66,"props":7389,"children":7391},{"className":7390},[],[7392],{"type":57,"value":5370},{"type":57,"value":7394}," when you need pixel-perfect images (e.g., verifying\nexact colors, alignment, or anti-aliasing).\n",{"type":52,"tag":110,"props":7396,"children":7398},{"className":112,"code":7397,"language":114,"meta":115,"style":115},"maui devflow ui screenshot --output full-res.png --scale native\n",[7399],{"type":52,"tag":66,"props":7400,"children":7401},{"__ignoreMap":115},[7402],{"type":52,"tag":121,"props":7403,"children":7404},{"class":123,"line":124},[7405,7409,7413,7417,7422,7426,7431,7436],{"type":52,"tag":121,"props":7406,"children":7407},{"style":128},[7408],{"type":57,"value":14},{"type":52,"tag":121,"props":7410,"children":7411},{"style":133},[7412],{"type":57,"value":619},{"type":52,"tag":121,"props":7414,"children":7415},{"style":133},[7416],{"type":57,"value":2197},{"type":52,"tag":121,"props":7418,"children":7419},{"style":133},[7420],{"type":57,"value":7421}," screenshot",{"type":52,"tag":121,"props":7423,"children":7424},{"style":133},[7425],{"type":57,"value":3128},{"type":52,"tag":121,"props":7427,"children":7428},{"style":133},[7429],{"type":57,"value":7430}," full-res.png",{"type":52,"tag":121,"props":7432,"children":7433},{"style":133},[7434],{"type":57,"value":7435}," --scale",{"type":52,"tag":121,"props":7437,"children":7438},{"style":133},[7439],{"type":57,"value":7440}," native\n",{"type":52,"tag":321,"props":7442,"children":7443},{},[7444,7449,7450,7455,7457],{"type":52,"tag":96,"props":7445,"children":7446},{},[7447],{"type":57,"value":7448},"Explicit max width:",{"type":57,"value":7387},{"type":52,"tag":66,"props":7451,"children":7453},{"className":7452},[],[7454],{"type":57,"value":5378},{"type":57,"value":7456}," to override auto-scaling with a specific pixel width.\n",{"type":52,"tag":110,"props":7458,"children":7460},{"className":112,"code":7459,"language":114,"meta":115,"style":115},"maui devflow ui screenshot --output screen.png --max-width 600\n",[7461],{"type":52,"tag":66,"props":7462,"children":7463},{"__ignoreMap":115},[7464],{"type":52,"tag":121,"props":7465,"children":7466},{"class":123,"line":124},[7467,7471,7475,7479,7483,7487,7492,7497],{"type":52,"tag":121,"props":7468,"children":7469},{"style":128},[7470],{"type":57,"value":14},{"type":52,"tag":121,"props":7472,"children":7473},{"style":133},[7474],{"type":57,"value":619},{"type":52,"tag":121,"props":7476,"children":7477},{"style":133},[7478],{"type":57,"value":2197},{"type":52,"tag":121,"props":7480,"children":7481},{"style":133},[7482],{"type":57,"value":7421},{"type":52,"tag":121,"props":7484,"children":7485},{"style":133},[7486],{"type":57,"value":3128},{"type":52,"tag":121,"props":7488,"children":7489},{"style":133},[7490],{"type":57,"value":7491}," screen.png",{"type":52,"tag":121,"props":7493,"children":7494},{"style":133},[7495],{"type":57,"value":7496}," --max-width",{"type":52,"tag":121,"props":7498,"children":7499},{"style":2665},[7500],{"type":57,"value":7501}," 600\n",{"type":52,"tag":495,"props":7503,"children":7505},{"id":7504},"eliminating-round-trips",[7506],{"type":57,"value":7507},"Eliminating Round-Trips",{"type":52,"tag":343,"props":7509,"children":7510},{},[7511,7665,7796,7857],{"type":52,"tag":321,"props":7512,"children":7513},{},[7514,7519,7521],{"type":52,"tag":96,"props":7515,"children":7516},{},[7517],{"type":57,"value":7518},"Use implicit resolution",{"type":57,"value":7520}," instead of query-then-act:\n",{"type":52,"tag":110,"props":7522,"children":7524},{"className":112,"code":7523,"language":114,"meta":115,"style":115},"# Instead of: query → get ID → tap\nmaui devflow ui tap --automationId \"LoginButton\"\nmaui devflow ui fill --automationId \"Username\" \"admin\"\nmaui devflow ui tap --type Button --index 0  # first Button\n",[7525],{"type":52,"tag":66,"props":7526,"children":7527},{"__ignoreMap":115},[7528,7536,7573,7622],{"type":52,"tag":121,"props":7529,"children":7530},{"class":123,"line":124},[7531],{"type":52,"tag":121,"props":7532,"children":7533},{"style":217},[7534],{"type":57,"value":7535},"# Instead of: query → get ID → tap\n",{"type":52,"tag":121,"props":7537,"children":7538},{"class":123,"line":192},[7539,7543,7547,7551,7555,7560,7564,7569],{"type":52,"tag":121,"props":7540,"children":7541},{"style":128},[7542],{"type":57,"value":14},{"type":52,"tag":121,"props":7544,"children":7545},{"style":133},[7546],{"type":57,"value":619},{"type":52,"tag":121,"props":7548,"children":7549},{"style":133},[7550],{"type":57,"value":2197},{"type":52,"tag":121,"props":7552,"children":7553},{"style":133},[7554],{"type":57,"value":3168},{"type":52,"tag":121,"props":7556,"children":7557},{"style":133},[7558],{"type":57,"value":7559}," --automationId",{"type":52,"tag":121,"props":7561,"children":7562},{"style":159},[7563],{"type":57,"value":546},{"type":52,"tag":121,"props":7565,"children":7566},{"style":133},[7567],{"type":57,"value":7568},"LoginButton",{"type":52,"tag":121,"props":7570,"children":7571},{"style":159},[7572],{"type":57,"value":1062},{"type":52,"tag":121,"props":7574,"children":7575},{"class":123,"line":223},[7576,7580,7584,7588,7592,7596,7600,7605,7609,7613,7618],{"type":52,"tag":121,"props":7577,"children":7578},{"style":128},[7579],{"type":57,"value":14},{"type":52,"tag":121,"props":7581,"children":7582},{"style":133},[7583],{"type":57,"value":619},{"type":52,"tag":121,"props":7585,"children":7586},{"style":133},[7587],{"type":57,"value":2197},{"type":52,"tag":121,"props":7589,"children":7590},{"style":133},[7591],{"type":57,"value":3238},{"type":52,"tag":121,"props":7593,"children":7594},{"style":133},[7595],{"type":57,"value":7559},{"type":52,"tag":121,"props":7597,"children":7598},{"style":159},[7599],{"type":57,"value":546},{"type":52,"tag":121,"props":7601,"children":7602},{"style":133},[7603],{"type":57,"value":7604},"Username",{"type":52,"tag":121,"props":7606,"children":7607},{"style":159},[7608],{"type":57,"value":556},{"type":52,"tag":121,"props":7610,"children":7611},{"style":159},[7612],{"type":57,"value":546},{"type":52,"tag":121,"props":7614,"children":7615},{"style":133},[7616],{"type":57,"value":7617},"admin",{"type":52,"tag":121,"props":7619,"children":7620},{"style":159},[7621],{"type":57,"value":1062},{"type":52,"tag":121,"props":7623,"children":7624},{"class":123,"line":1008},[7625,7629,7633,7637,7641,7645,7650,7655,7660],{"type":52,"tag":121,"props":7626,"children":7627},{"style":128},[7628],{"type":57,"value":14},{"type":52,"tag":121,"props":7630,"children":7631},{"style":133},[7632],{"type":57,"value":619},{"type":52,"tag":121,"props":7634,"children":7635},{"style":133},[7636],{"type":57,"value":2197},{"type":52,"tag":121,"props":7638,"children":7639},{"style":133},[7640],{"type":57,"value":3168},{"type":52,"tag":121,"props":7642,"children":7643},{"style":133},[7644],{"type":57,"value":3991},{"type":52,"tag":121,"props":7646,"children":7647},{"style":133},[7648],{"type":57,"value":7649}," Button",{"type":52,"tag":121,"props":7651,"children":7652},{"style":133},[7653],{"type":57,"value":7654}," --index",{"type":52,"tag":121,"props":7656,"children":7657},{"style":2665},[7658],{"type":57,"value":7659}," 0",{"type":52,"tag":121,"props":7661,"children":7662},{"style":217},[7663],{"type":57,"value":7664},"  # first Button\n",{"type":52,"tag":321,"props":7666,"children":7667},{},[7668,7677,7679],{"type":52,"tag":96,"props":7669,"children":7670},{},[7671,7672],{"type":57,"value":7021},{"type":52,"tag":66,"props":7673,"children":7675},{"className":7674},[],[7676],{"type":57,"value":5228},{"type":57,"value":7678}," instead of polling loops:\n",{"type":52,"tag":110,"props":7680,"children":7682},{"className":112,"code":7681,"language":114,"meta":115,"style":115},"maui devflow ui query --automationId \"ResultsList\" --wait-until exists --timeout 10\nmaui devflow ui query --automationId \"Spinner\" --wait-until gone --timeout 30\n",[7683],{"type":52,"tag":66,"props":7684,"children":7685},{"__ignoreMap":115},[7686,7742],{"type":52,"tag":121,"props":7687,"children":7688},{"class":123,"line":124},[7689,7693,7697,7701,7706,7710,7714,7719,7723,7728,7733,7737],{"type":52,"tag":121,"props":7690,"children":7691},{"style":128},[7692],{"type":57,"value":14},{"type":52,"tag":121,"props":7694,"children":7695},{"style":133},[7696],{"type":57,"value":619},{"type":52,"tag":121,"props":7698,"children":7699},{"style":133},[7700],{"type":57,"value":2197},{"type":52,"tag":121,"props":7702,"children":7703},{"style":133},[7704],{"type":57,"value":7705}," query",{"type":52,"tag":121,"props":7707,"children":7708},{"style":133},[7709],{"type":57,"value":7559},{"type":52,"tag":121,"props":7711,"children":7712},{"style":159},[7713],{"type":57,"value":546},{"type":52,"tag":121,"props":7715,"children":7716},{"style":133},[7717],{"type":57,"value":7718},"ResultsList",{"type":52,"tag":121,"props":7720,"children":7721},{"style":159},[7722],{"type":57,"value":556},{"type":52,"tag":121,"props":7724,"children":7725},{"style":133},[7726],{"type":57,"value":7727}," --wait-until",{"type":52,"tag":121,"props":7729,"children":7730},{"style":133},[7731],{"type":57,"value":7732}," exists",{"type":52,"tag":121,"props":7734,"children":7735},{"style":133},[7736],{"type":57,"value":4626},{"type":52,"tag":121,"props":7738,"children":7739},{"style":2665},[7740],{"type":57,"value":7741}," 10\n",{"type":52,"tag":121,"props":7743,"children":7744},{"class":123,"line":192},[7745,7749,7753,7757,7761,7765,7769,7774,7778,7782,7787,7791],{"type":52,"tag":121,"props":7746,"children":7747},{"style":128},[7748],{"type":57,"value":14},{"type":52,"tag":121,"props":7750,"children":7751},{"style":133},[7752],{"type":57,"value":619},{"type":52,"tag":121,"props":7754,"children":7755},{"style":133},[7756],{"type":57,"value":2197},{"type":52,"tag":121,"props":7758,"children":7759},{"style":133},[7760],{"type":57,"value":7705},{"type":52,"tag":121,"props":7762,"children":7763},{"style":133},[7764],{"type":57,"value":7559},{"type":52,"tag":121,"props":7766,"children":7767},{"style":159},[7768],{"type":57,"value":546},{"type":52,"tag":121,"props":7770,"children":7771},{"style":133},[7772],{"type":57,"value":7773},"Spinner",{"type":52,"tag":121,"props":7775,"children":7776},{"style":159},[7777],{"type":57,"value":556},{"type":52,"tag":121,"props":7779,"children":7780},{"style":133},[7781],{"type":57,"value":7727},{"type":52,"tag":121,"props":7783,"children":7784},{"style":133},[7785],{"type":57,"value":7786}," gone",{"type":52,"tag":121,"props":7788,"children":7789},{"style":133},[7790],{"type":57,"value":4626},{"type":52,"tag":121,"props":7792,"children":7793},{"style":2665},[7794],{"type":57,"value":7795}," 30\n",{"type":52,"tag":321,"props":7797,"children":7798},{},[7799,7804,7806],{"type":52,"tag":96,"props":7800,"children":7801},{},[7802],{"type":57,"value":7803},"Use post-action flags",{"type":57,"value":7805}," to verify in one call:\n",{"type":52,"tag":110,"props":7807,"children":7809},{"className":112,"code":7808,"language":114,"meta":115,"style":115},"maui devflow ui tap abc123 --and-screenshot --and-tree --and-tree-depth 5\n",[7810],{"type":52,"tag":66,"props":7811,"children":7812},{"__ignoreMap":115},[7813],{"type":52,"tag":121,"props":7814,"children":7815},{"class":123,"line":124},[7816,7820,7824,7828,7832,7837,7842,7847,7852],{"type":52,"tag":121,"props":7817,"children":7818},{"style":128},[7819],{"type":57,"value":14},{"type":52,"tag":121,"props":7821,"children":7822},{"style":133},[7823],{"type":57,"value":619},{"type":52,"tag":121,"props":7825,"children":7826},{"style":133},[7827],{"type":57,"value":2197},{"type":52,"tag":121,"props":7829,"children":7830},{"style":133},[7831],{"type":57,"value":3168},{"type":52,"tag":121,"props":7833,"children":7834},{"style":133},[7835],{"type":57,"value":7836}," abc123",{"type":52,"tag":121,"props":7838,"children":7839},{"style":133},[7840],{"type":57,"value":7841}," --and-screenshot",{"type":52,"tag":121,"props":7843,"children":7844},{"style":133},[7845],{"type":57,"value":7846}," --and-tree",{"type":52,"tag":121,"props":7848,"children":7849},{"style":133},[7850],{"type":57,"value":7851}," --and-tree-depth",{"type":52,"tag":121,"props":7853,"children":7854},{"style":2665},[7855],{"type":57,"value":7856}," 5\n",{"type":52,"tag":321,"props":7858,"children":7859},{},[7860,7870,7872],{"type":52,"tag":96,"props":7861,"children":7862},{},[7863,7864],{"type":57,"value":7021},{"type":52,"tag":66,"props":7865,"children":7867},{"className":7866},[],[7868],{"type":57,"value":7869},"MAUI assert",{"type":57,"value":7871}," for quick state checks:\n",{"type":52,"tag":110,"props":7873,"children":7875},{"className":112,"code":7874,"language":114,"meta":115,"style":115},"maui devflow ui assert --id abc123 Text \"Welcome!\"\nmaui devflow ui assert --automationId \"Counter\" Text \"5\"\n",[7876],{"type":52,"tag":66,"props":7877,"children":7878},{"__ignoreMap":115},[7879,7926],{"type":52,"tag":121,"props":7880,"children":7881},{"class":123,"line":124},[7882,7886,7890,7894,7899,7904,7908,7913,7917,7922],{"type":52,"tag":121,"props":7883,"children":7884},{"style":128},[7885],{"type":57,"value":14},{"type":52,"tag":121,"props":7887,"children":7888},{"style":133},[7889],{"type":57,"value":619},{"type":52,"tag":121,"props":7891,"children":7892},{"style":133},[7893],{"type":57,"value":2197},{"type":52,"tag":121,"props":7895,"children":7896},{"style":133},[7897],{"type":57,"value":7898}," assert",{"type":52,"tag":121,"props":7900,"children":7901},{"style":133},[7902],{"type":57,"value":7903}," --id",{"type":52,"tag":121,"props":7905,"children":7906},{"style":133},[7907],{"type":57,"value":7836},{"type":52,"tag":121,"props":7909,"children":7910},{"style":133},[7911],{"type":57,"value":7912}," Text",{"type":52,"tag":121,"props":7914,"children":7915},{"style":159},[7916],{"type":57,"value":546},{"type":52,"tag":121,"props":7918,"children":7919},{"style":133},[7920],{"type":57,"value":7921},"Welcome!",{"type":52,"tag":121,"props":7923,"children":7924},{"style":159},[7925],{"type":57,"value":1062},{"type":52,"tag":121,"props":7927,"children":7928},{"class":123,"line":192},[7929,7933,7937,7941,7945,7949,7953,7958,7962,7966,7970,7975],{"type":52,"tag":121,"props":7930,"children":7931},{"style":128},[7932],{"type":57,"value":14},{"type":52,"tag":121,"props":7934,"children":7935},{"style":133},[7936],{"type":57,"value":619},{"type":52,"tag":121,"props":7938,"children":7939},{"style":133},[7940],{"type":57,"value":2197},{"type":52,"tag":121,"props":7942,"children":7943},{"style":133},[7944],{"type":57,"value":7898},{"type":52,"tag":121,"props":7946,"children":7947},{"style":133},[7948],{"type":57,"value":7559},{"type":52,"tag":121,"props":7950,"children":7951},{"style":159},[7952],{"type":57,"value":546},{"type":52,"tag":121,"props":7954,"children":7955},{"style":133},[7956],{"type":57,"value":7957},"Counter",{"type":52,"tag":121,"props":7959,"children":7960},{"style":159},[7961],{"type":57,"value":556},{"type":52,"tag":121,"props":7963,"children":7964},{"style":133},[7965],{"type":57,"value":7912},{"type":52,"tag":121,"props":7967,"children":7968},{"style":159},[7969],{"type":57,"value":546},{"type":52,"tag":121,"props":7971,"children":7972},{"style":133},[7973],{"type":57,"value":7974},"5",{"type":52,"tag":121,"props":7976,"children":7977},{"style":159},[7978],{"type":57,"value":1062},{"type":52,"tag":495,"props":7980,"children":7982},{"id":7981},"element-ids",[7983],{"type":57,"value":7984},"Element IDs",{"type":52,"tag":343,"props":7986,"children":7987},{},[7988,8000,8018,8029],{"type":52,"tag":321,"props":7989,"children":7990},{},[7991,7993,7998],{"type":57,"value":7992},"Element IDs are ",{"type":52,"tag":96,"props":7994,"children":7995},{},[7996],{"type":57,"value":7997},"ephemeral",{"type":57,"value":7999}," — re-query after navigation or state changes.",{"type":52,"tag":321,"props":8001,"children":8002},{},[8003,8005,8010,8011,8017],{"type":57,"value":8004},"Don't cache element IDs across multiple actions — refresh with ",{"type":52,"tag":66,"props":8006,"children":8008},{"className":8007},[],[8009],{"type":57,"value":7142},{"type":57,"value":6073},{"type":52,"tag":66,"props":8012,"children":8014},{"className":8013},[],[8015],{"type":57,"value":8016},"query",{"type":57,"value":89},{"type":52,"tag":321,"props":8019,"children":8020},{},[8021,8022,8027],{"type":57,"value":7294},{"type":52,"tag":66,"props":8023,"children":8025},{"className":8024},[],[8026],{"type":57,"value":5070},{"type":57,"value":8028}," for stable references (set in XAML).",{"type":52,"tag":321,"props":8030,"children":8031},{},[8032,8033,8039],{"type":57,"value":7021},{"type":52,"tag":66,"props":8034,"children":8036},{"className":8035},[],[8037],{"type":57,"value":8038},"maui devflow commands --json",{"type":57,"value":8040}," to discover available commands at runtime.",{"type":52,"tag":495,"props":8042,"children":8044},{"id":8043},"shell-navigation",[8045],{"type":57,"value":8046},"Shell Navigation",{"type":52,"tag":343,"props":8048,"children":8049},{},[8050,8119,8137],{"type":52,"tag":321,"props":8051,"children":8052},{},[8053,8058,8060,8066,8068,8074,8076,8081,8083],{"type":52,"tag":96,"props":8054,"children":8055},{},[8056],{"type":57,"value":8057},"Routes are case-sensitive",{"type":57,"value":8059}," and come from ",{"type":52,"tag":66,"props":8061,"children":8063},{"className":8062},[],[8064],{"type":57,"value":8065},"ShellContent Route=\"\"",{"type":57,"value":8067}," in XAML, not from\n",{"type":52,"tag":66,"props":8069,"children":8071},{"className":8070},[],[8072],{"type":57,"value":8073},"FlyoutItem Title",{"type":57,"value":8075},". Discover routes by reading ",{"type":52,"tag":66,"props":8077,"children":8079},{"className":8078},[],[8080],{"type":57,"value":7100},{"type":57,"value":8082},":\n",{"type":52,"tag":110,"props":8084,"children":8086},{"className":112,"code":8085,"language":114,"meta":115,"style":115},"grep -i 'Route=' AppShell.xaml\n",[8087],{"type":52,"tag":66,"props":8088,"children":8089},{"__ignoreMap":115},[8090],{"type":52,"tag":121,"props":8091,"children":8092},{"class":123,"line":124},[8093,8097,8101,8105,8110,8114],{"type":52,"tag":121,"props":8094,"children":8095},{"style":128},[8096],{"type":57,"value":536},{"type":52,"tag":121,"props":8098,"children":8099},{"style":133},[8100],{"type":57,"value":1327},{"type":52,"tag":121,"props":8102,"children":8103},{"style":159},[8104],{"type":57,"value":1332},{"type":52,"tag":121,"props":8106,"children":8107},{"style":133},[8108],{"type":57,"value":8109},"Route=",{"type":52,"tag":121,"props":8111,"children":8112},{"style":159},[8113],{"type":57,"value":1342},{"type":52,"tag":121,"props":8115,"children":8116},{"style":133},[8117],{"type":57,"value":8118}," AppShell.xaml\n",{"type":52,"tag":321,"props":8120,"children":8121},{},[8122,8127,8129,8135],{"type":52,"tag":96,"props":8123,"children":8124},{},[8125],{"type":57,"value":8126},"Flyout menu items",{"type":57,"value":8128}," use generated IDs like ",{"type":52,"tag":66,"props":8130,"children":8132},{"className":8131},[],[8133],{"type":57,"value":8134},"FlyoutItem_D_FAULT_FlyoutItem0",{"type":57,"value":8136},". Find them\nat the top level of the tree output. Don't try to tap Labels inside flyout items.",{"type":52,"tag":321,"props":8138,"children":8139},{},[8140,8145,8147],{"type":52,"tag":96,"props":8141,"children":8142},{},[8143],{"type":57,"value":8144},"Flyout dismissal:",{"type":57,"value":8146}," After tapping a flyout item, the flyout may stay open. Dismiss with:\n",{"type":52,"tag":110,"props":8148,"children":8150},{"className":112,"code":8149,"language":114,"meta":115,"style":115},"maui devflow ui set-property \u003CshellId> FlyoutIsPresented \"false\"\n",[8151],{"type":52,"tag":66,"props":8152,"children":8153},{"__ignoreMap":115},[8154],{"type":52,"tag":121,"props":8155,"children":8156},{"class":123,"line":124},[8157,8161,8165,8169,8173,8177,8182,8186,8190,8195,8199,8204],{"type":52,"tag":121,"props":8158,"children":8159},{"style":128},[8160],{"type":57,"value":14},{"type":52,"tag":121,"props":8162,"children":8163},{"style":133},[8164],{"type":57,"value":619},{"type":52,"tag":121,"props":8166,"children":8167},{"style":133},[8168],{"type":57,"value":2197},{"type":52,"tag":121,"props":8170,"children":8171},{"style":133},[8172],{"type":57,"value":2310},{"type":52,"tag":121,"props":8174,"children":8175},{"style":159},[8176],{"type":57,"value":1084},{"type":52,"tag":121,"props":8178,"children":8179},{"style":133},[8180],{"type":57,"value":8181},"shellI",{"type":52,"tag":121,"props":8183,"children":8184},{"style":1092},[8185],{"type":57,"value":2216},{"type":52,"tag":121,"props":8187,"children":8188},{"style":159},[8189],{"type":57,"value":1100},{"type":52,"tag":121,"props":8191,"children":8192},{"style":133},[8193],{"type":57,"value":8194}," FlyoutIsPresented",{"type":52,"tag":121,"props":8196,"children":8197},{"style":159},[8198],{"type":57,"value":546},{"type":52,"tag":121,"props":8200,"children":8201},{"style":133},[8202],{"type":57,"value":8203},"false",{"type":52,"tag":121,"props":8205,"children":8206},{"style":159},[8207],{"type":57,"value":1062},{"type":52,"tag":495,"props":8209,"children":8211},{"id":8210},"collectionview-listview",[8212],{"type":57,"value":8213},"CollectionView \u002F ListView",{"type":52,"tag":343,"props":8215,"children":8216},{},[8217,8227,8245,8326,8394],{"type":52,"tag":321,"props":8218,"children":8219},{},[8220,8225],{"type":52,"tag":96,"props":8221,"children":8222},{},[8223],{"type":57,"value":8224},"Tapping items:",{"type":57,"value":8226}," Always tap the item's container (Grid\u002FStackLayout), not inner elements\n(Label\u002FImage). The item template's root element handles selection.",{"type":52,"tag":321,"props":8228,"children":8229},{},[8230,8235,8237,8243],{"type":52,"tag":96,"props":8231,"children":8232},{},[8233],{"type":57,"value":8234},"Virtualization:",{"type":57,"value":8236}," CollectionView\u002FListView use item virtualization — only visible items\n(plus a small buffer) exist in the visual tree. Off-screen items have NO visual element.\nThe tree shows ",{"type":52,"tag":66,"props":8238,"children":8240},{"className":8239},[],[8241],{"type":57,"value":8242},"itemCount",{"type":57,"value":8244}," in the CollectionView's properties so you know total items.",{"type":52,"tag":321,"props":8246,"children":8247},{},[8248,8253,8255,8324],{"type":52,"tag":96,"props":8249,"children":8250},{},[8251],{"type":57,"value":8252},"Scrolling by item index",{"type":57,"value":8254}," (best for reaching off-screen items):\n",{"type":52,"tag":110,"props":8256,"children":8258},{"className":112,"code":8257,"language":114,"meta":115,"style":115},"maui devflow ui scroll --element \u003CcvId> --item-index 20 --position Center\n",[8259],{"type":52,"tag":66,"props":8260,"children":8261},{"__ignoreMap":115},[8262],{"type":52,"tag":121,"props":8263,"children":8264},{"class":123,"line":124},[8265,8269,8273,8277,8282,8287,8291,8296,8300,8304,8309,8314,8319],{"type":52,"tag":121,"props":8266,"children":8267},{"style":128},[8268],{"type":57,"value":14},{"type":52,"tag":121,"props":8270,"children":8271},{"style":133},[8272],{"type":57,"value":619},{"type":52,"tag":121,"props":8274,"children":8275},{"style":133},[8276],{"type":57,"value":2197},{"type":52,"tag":121,"props":8278,"children":8279},{"style":133},[8280],{"type":57,"value":8281}," scroll",{"type":52,"tag":121,"props":8283,"children":8284},{"style":133},[8285],{"type":57,"value":8286}," --element",{"type":52,"tag":121,"props":8288,"children":8289},{"style":159},[8290],{"type":57,"value":1084},{"type":52,"tag":121,"props":8292,"children":8293},{"style":133},[8294],{"type":57,"value":8295},"cvI",{"type":52,"tag":121,"props":8297,"children":8298},{"style":1092},[8299],{"type":57,"value":2216},{"type":52,"tag":121,"props":8301,"children":8302},{"style":159},[8303],{"type":57,"value":1100},{"type":52,"tag":121,"props":8305,"children":8306},{"style":133},[8307],{"type":57,"value":8308}," --item-index",{"type":52,"tag":121,"props":8310,"children":8311},{"style":2665},[8312],{"type":57,"value":8313}," 20",{"type":52,"tag":121,"props":8315,"children":8316},{"style":133},[8317],{"type":57,"value":8318}," --position",{"type":52,"tag":121,"props":8320,"children":8321},{"style":133},[8322],{"type":57,"value":8323}," Center\n",{"type":57,"value":8325},"\nThis works even for items not in the tree yet — the platform scrolls to materialize them.",{"type":52,"tag":321,"props":8327,"children":8328},{},[8329,8334,8336,8392],{"type":52,"tag":96,"props":8330,"children":8331},{},[8332],{"type":57,"value":8333},"Scrolling by pixel delta",{"type":57,"value":8335}," (for fine-grained scrolling):\n",{"type":52,"tag":110,"props":8337,"children":8339},{"className":112,"code":8338,"language":114,"meta":115,"style":115},"maui devflow ui scroll --element \u003CcvId> --dy -500\n",[8340],{"type":52,"tag":66,"props":8341,"children":8342},{"__ignoreMap":115},[8343],{"type":52,"tag":121,"props":8344,"children":8345},{"class":123,"line":124},[8346,8350,8354,8358,8362,8366,8370,8374,8378,8382,8387],{"type":52,"tag":121,"props":8347,"children":8348},{"style":128},[8349],{"type":57,"value":14},{"type":52,"tag":121,"props":8351,"children":8352},{"style":133},[8353],{"type":57,"value":619},{"type":52,"tag":121,"props":8355,"children":8356},{"style":133},[8357],{"type":57,"value":2197},{"type":52,"tag":121,"props":8359,"children":8360},{"style":133},[8361],{"type":57,"value":8281},{"type":52,"tag":121,"props":8363,"children":8364},{"style":133},[8365],{"type":57,"value":8286},{"type":52,"tag":121,"props":8367,"children":8368},{"style":159},[8369],{"type":57,"value":1084},{"type":52,"tag":121,"props":8371,"children":8372},{"style":133},[8373],{"type":57,"value":8295},{"type":52,"tag":121,"props":8375,"children":8376},{"style":1092},[8377],{"type":57,"value":2216},{"type":52,"tag":121,"props":8379,"children":8380},{"style":159},[8381],{"type":57,"value":1100},{"type":52,"tag":121,"props":8383,"children":8384},{"style":133},[8385],{"type":57,"value":8386}," --dy",{"type":52,"tag":121,"props":8388,"children":8389},{"style":133},[8390],{"type":57,"value":8391}," -500\n",{"type":57,"value":8393},"\nUses native platform scroll (UIScrollView\u002FRecyclerView) — works on CollectionView.",{"type":52,"tag":321,"props":8395,"children":8396},{},[8397,8402,8404,8409,8411],{"type":52,"tag":96,"props":8398,"children":8399},{},[8400],{"type":57,"value":8401},"Workflow:",{"type":57,"value":8403}," Get tree → note ",{"type":52,"tag":66,"props":8405,"children":8407},{"className":8406},[],[8408],{"type":57,"value":8242},{"type":57,"value":8410}," → scroll by index → re-query tree → interact:\n",{"type":52,"tag":110,"props":8412,"children":8414},{"className":112,"code":8413,"language":114,"meta":115,"style":115},"maui devflow ui tree --depth 15   # CollectionView shows itemCount: 25\nmaui devflow ui scroll --item-index 20\nmaui devflow ui tree --depth 15   # items around index 20 now visible\n",[8415],{"type":52,"tag":66,"props":8416,"children":8417},{"__ignoreMap":115},[8418,8453,8481],{"type":52,"tag":121,"props":8419,"children":8420},{"class":123,"line":124},[8421,8425,8429,8433,8438,8443,8448],{"type":52,"tag":121,"props":8422,"children":8423},{"style":128},[8424],{"type":57,"value":14},{"type":52,"tag":121,"props":8426,"children":8427},{"style":133},[8428],{"type":57,"value":619},{"type":52,"tag":121,"props":8430,"children":8431},{"style":133},[8432],{"type":57,"value":2197},{"type":52,"tag":121,"props":8434,"children":8435},{"style":133},[8436],{"type":57,"value":8437}," tree",{"type":52,"tag":121,"props":8439,"children":8440},{"style":133},[8441],{"type":57,"value":8442}," --depth",{"type":52,"tag":121,"props":8444,"children":8445},{"style":2665},[8446],{"type":57,"value":8447}," 15",{"type":52,"tag":121,"props":8449,"children":8450},{"style":217},[8451],{"type":57,"value":8452},"   # CollectionView shows itemCount: 25\n",{"type":52,"tag":121,"props":8454,"children":8455},{"class":123,"line":192},[8456,8460,8464,8468,8472,8476],{"type":52,"tag":121,"props":8457,"children":8458},{"style":128},[8459],{"type":57,"value":14},{"type":52,"tag":121,"props":8461,"children":8462},{"style":133},[8463],{"type":57,"value":619},{"type":52,"tag":121,"props":8465,"children":8466},{"style":133},[8467],{"type":57,"value":2197},{"type":52,"tag":121,"props":8469,"children":8470},{"style":133},[8471],{"type":57,"value":8281},{"type":52,"tag":121,"props":8473,"children":8474},{"style":133},[8475],{"type":57,"value":8308},{"type":52,"tag":121,"props":8477,"children":8478},{"style":2665},[8479],{"type":57,"value":8480}," 20\n",{"type":52,"tag":121,"props":8482,"children":8483},{"class":123,"line":223},[8484,8488,8492,8496,8500,8504,8508],{"type":52,"tag":121,"props":8485,"children":8486},{"style":128},[8487],{"type":57,"value":14},{"type":52,"tag":121,"props":8489,"children":8490},{"style":133},[8491],{"type":57,"value":619},{"type":52,"tag":121,"props":8493,"children":8494},{"style":133},[8495],{"type":57,"value":2197},{"type":52,"tag":121,"props":8497,"children":8498},{"style":133},[8499],{"type":57,"value":8437},{"type":52,"tag":121,"props":8501,"children":8502},{"style":133},[8503],{"type":57,"value":8442},{"type":52,"tag":121,"props":8505,"children":8506},{"style":2665},[8507],{"type":57,"value":8447},{"type":52,"tag":121,"props":8509,"children":8510},{"style":217},[8511],{"type":57,"value":8512},"   # items around index 20 now visible\n",{"type":52,"tag":495,"props":8514,"children":8516},{"id":8515},"implicit-resolution-gotchas",[8517],{"type":57,"value":8518},"Implicit Resolution Gotchas",{"type":52,"tag":343,"props":8520,"children":8521},{},[8522,8559,8587],{"type":52,"tag":321,"props":8523,"children":8524},{},[8525,8535,8537,8543,8544,8550,8551,8557],{"type":52,"tag":96,"props":8526,"children":8527},{},[8528,8533],{"type":52,"tag":66,"props":8529,"children":8531},{"className":8530},[],[8532],{"type":57,"value":5084},{"type":57,"value":8534}," searches the entire visual tree",{"type":57,"value":8536},", including hidden pages (other Shell tabs).\nIf the text is ambiguous (e.g., ",{"type":52,"tag":66,"props":8538,"children":8540},{"className":8539},[],[8541],{"type":57,"value":8542},"\"+\"",{"type":57,"value":1300},{"type":52,"tag":66,"props":8545,"children":8547},{"className":8546},[],[8548],{"type":57,"value":8549},"\"OK\"",{"type":57,"value":1300},{"type":52,"tag":66,"props":8552,"children":8554},{"className":8553},[],[8555],{"type":57,"value":8556},"\"Cancel\"",{"type":57,"value":8558},"), it may match a wrong element\non a different page.",{"type":52,"tag":321,"props":8560,"children":8561},{},[8562,8571,8573,8578,8580,8585],{"type":52,"tag":96,"props":8563,"children":8564},{},[8565,8566],{"type":57,"value":7294},{"type":52,"tag":66,"props":8567,"children":8569},{"className":8568},[],[8570],{"type":57,"value":5070},{"type":57,"value":8572}," for reliable targeting. Fall back to explicit element IDs from\n",{"type":52,"tag":66,"props":8574,"children":8576},{"className":8575},[],[8577],{"type":57,"value":7142},{"type":57,"value":8579},"\u002F",{"type":52,"tag":66,"props":8581,"children":8583},{"className":8582},[],[8584],{"type":57,"value":8016},{"type":57,"value":8586}," for elements without AutomationIds.",{"type":52,"tag":321,"props":8588,"children":8589},{},[8590,8608],{"type":52,"tag":96,"props":8591,"children":8592},{},[8593,8594,8599,8601,8606],{"type":57,"value":7021},{"type":52,"tag":66,"props":8595,"children":8597},{"className":8596},[],[8598],{"type":57,"value":5077},{"type":57,"value":8600}," + ",{"type":52,"tag":66,"props":8602,"children":8604},{"className":8603},[],[8605],{"type":57,"value":5084},{"type":57,"value":8607}," together",{"type":57,"value":8609}," to narrow matches when text alone is ambiguous.",{"type":52,"tag":495,"props":8611,"children":8613},{"id":8612},"canonical-workflows",[8614],{"type":57,"value":8615},"Canonical Workflows",{"type":52,"tag":60,"props":8617,"children":8618},{},[8619],{"type":52,"tag":96,"props":8620,"children":8621},{},[8622],{"type":57,"value":8623},"Login flow:",{"type":52,"tag":110,"props":8625,"children":8627},{"className":112,"code":8626,"language":114,"meta":115,"style":115},"maui devflow ui query --automationId \"LoginPage\" --wait-until exists --timeout 15\nmaui devflow ui fill --automationId \"UsernameField\" \"admin\"\nmaui devflow ui fill --automationId \"PasswordField\" \"password\"\nmaui devflow ui tap --automationId \"LoginButton\" --and-screenshot\nmaui devflow ui query --automationId \"HomePage\" --wait-until exists --timeout 10\n",[8628],{"type":52,"tag":66,"props":8629,"children":8630},{"__ignoreMap":115},[8631,8683,8731,8780,8820],{"type":52,"tag":121,"props":8632,"children":8633},{"class":123,"line":124},[8634,8638,8642,8646,8650,8654,8658,8663,8667,8671,8675,8679],{"type":52,"tag":121,"props":8635,"children":8636},{"style":128},[8637],{"type":57,"value":14},{"type":52,"tag":121,"props":8639,"children":8640},{"style":133},[8641],{"type":57,"value":619},{"type":52,"tag":121,"props":8643,"children":8644},{"style":133},[8645],{"type":57,"value":2197},{"type":52,"tag":121,"props":8647,"children":8648},{"style":133},[8649],{"type":57,"value":7705},{"type":52,"tag":121,"props":8651,"children":8652},{"style":133},[8653],{"type":57,"value":7559},{"type":52,"tag":121,"props":8655,"children":8656},{"style":159},[8657],{"type":57,"value":546},{"type":52,"tag":121,"props":8659,"children":8660},{"style":133},[8661],{"type":57,"value":8662},"LoginPage",{"type":52,"tag":121,"props":8664,"children":8665},{"style":159},[8666],{"type":57,"value":556},{"type":52,"tag":121,"props":8668,"children":8669},{"style":133},[8670],{"type":57,"value":7727},{"type":52,"tag":121,"props":8672,"children":8673},{"style":133},[8674],{"type":57,"value":7732},{"type":52,"tag":121,"props":8676,"children":8677},{"style":133},[8678],{"type":57,"value":4626},{"type":52,"tag":121,"props":8680,"children":8681},{"style":2665},[8682],{"type":57,"value":4631},{"type":52,"tag":121,"props":8684,"children":8685},{"class":123,"line":192},[8686,8690,8694,8698,8702,8706,8710,8715,8719,8723,8727],{"type":52,"tag":121,"props":8687,"children":8688},{"style":128},[8689],{"type":57,"value":14},{"type":52,"tag":121,"props":8691,"children":8692},{"style":133},[8693],{"type":57,"value":619},{"type":52,"tag":121,"props":8695,"children":8696},{"style":133},[8697],{"type":57,"value":2197},{"type":52,"tag":121,"props":8699,"children":8700},{"style":133},[8701],{"type":57,"value":3238},{"type":52,"tag":121,"props":8703,"children":8704},{"style":133},[8705],{"type":57,"value":7559},{"type":52,"tag":121,"props":8707,"children":8708},{"style":159},[8709],{"type":57,"value":546},{"type":52,"tag":121,"props":8711,"children":8712},{"style":133},[8713],{"type":57,"value":8714},"UsernameField",{"type":52,"tag":121,"props":8716,"children":8717},{"style":159},[8718],{"type":57,"value":556},{"type":52,"tag":121,"props":8720,"children":8721},{"style":159},[8722],{"type":57,"value":546},{"type":52,"tag":121,"props":8724,"children":8725},{"style":133},[8726],{"type":57,"value":7617},{"type":52,"tag":121,"props":8728,"children":8729},{"style":159},[8730],{"type":57,"value":1062},{"type":52,"tag":121,"props":8732,"children":8733},{"class":123,"line":223},[8734,8738,8742,8746,8750,8754,8758,8763,8767,8771,8776],{"type":52,"tag":121,"props":8735,"children":8736},{"style":128},[8737],{"type":57,"value":14},{"type":52,"tag":121,"props":8739,"children":8740},{"style":133},[8741],{"type":57,"value":619},{"type":52,"tag":121,"props":8743,"children":8744},{"style":133},[8745],{"type":57,"value":2197},{"type":52,"tag":121,"props":8747,"children":8748},{"style":133},[8749],{"type":57,"value":3238},{"type":52,"tag":121,"props":8751,"children":8752},{"style":133},[8753],{"type":57,"value":7559},{"type":52,"tag":121,"props":8755,"children":8756},{"style":159},[8757],{"type":57,"value":546},{"type":52,"tag":121,"props":8759,"children":8760},{"style":133},[8761],{"type":57,"value":8762},"PasswordField",{"type":52,"tag":121,"props":8764,"children":8765},{"style":159},[8766],{"type":57,"value":556},{"type":52,"tag":121,"props":8768,"children":8769},{"style":159},[8770],{"type":57,"value":546},{"type":52,"tag":121,"props":8772,"children":8773},{"style":133},[8774],{"type":57,"value":8775},"password",{"type":52,"tag":121,"props":8777,"children":8778},{"style":159},[8779],{"type":57,"value":1062},{"type":52,"tag":121,"props":8781,"children":8782},{"class":123,"line":1008},[8783,8787,8791,8795,8799,8803,8807,8811,8815],{"type":52,"tag":121,"props":8784,"children":8785},{"style":128},[8786],{"type":57,"value":14},{"type":52,"tag":121,"props":8788,"children":8789},{"style":133},[8790],{"type":57,"value":619},{"type":52,"tag":121,"props":8792,"children":8793},{"style":133},[8794],{"type":57,"value":2197},{"type":52,"tag":121,"props":8796,"children":8797},{"style":133},[8798],{"type":57,"value":3168},{"type":52,"tag":121,"props":8800,"children":8801},{"style":133},[8802],{"type":57,"value":7559},{"type":52,"tag":121,"props":8804,"children":8805},{"style":159},[8806],{"type":57,"value":546},{"type":52,"tag":121,"props":8808,"children":8809},{"style":133},[8810],{"type":57,"value":7568},{"type":52,"tag":121,"props":8812,"children":8813},{"style":159},[8814],{"type":57,"value":556},{"type":52,"tag":121,"props":8816,"children":8817},{"style":133},[8818],{"type":57,"value":8819}," --and-screenshot\n",{"type":52,"tag":121,"props":8821,"children":8822},{"class":123,"line":1065},[8823,8827,8831,8835,8839,8843,8847,8852,8856,8860,8864,8868],{"type":52,"tag":121,"props":8824,"children":8825},{"style":128},[8826],{"type":57,"value":14},{"type":52,"tag":121,"props":8828,"children":8829},{"style":133},[8830],{"type":57,"value":619},{"type":52,"tag":121,"props":8832,"children":8833},{"style":133},[8834],{"type":57,"value":2197},{"type":52,"tag":121,"props":8836,"children":8837},{"style":133},[8838],{"type":57,"value":7705},{"type":52,"tag":121,"props":8840,"children":8841},{"style":133},[8842],{"type":57,"value":7559},{"type":52,"tag":121,"props":8844,"children":8845},{"style":159},[8846],{"type":57,"value":546},{"type":52,"tag":121,"props":8848,"children":8849},{"style":133},[8850],{"type":57,"value":8851},"HomePage",{"type":52,"tag":121,"props":8853,"children":8854},{"style":159},[8855],{"type":57,"value":556},{"type":52,"tag":121,"props":8857,"children":8858},{"style":133},[8859],{"type":57,"value":7727},{"type":52,"tag":121,"props":8861,"children":8862},{"style":133},[8863],{"type":57,"value":7732},{"type":52,"tag":121,"props":8865,"children":8866},{"style":133},[8867],{"type":57,"value":4626},{"type":52,"tag":121,"props":8869,"children":8870},{"style":2665},[8871],{"type":57,"value":7741},{"type":52,"tag":60,"props":8873,"children":8874},{},[8875],{"type":52,"tag":96,"props":8876,"children":8877},{},[8878],{"type":57,"value":8879},"Shell navigation:",{"type":52,"tag":110,"props":8881,"children":8883},{"className":112,"code":8882,"language":114,"meta":115,"style":115},"# Discover routes from XAML\ngrep -i 'Route=' AppShell.xaml                              # find route names\nmaui devflow ui navigate \"\u002F\u002Fhome\"                         # navigate to a route\nmaui devflow ui tap FlyoutButton                          # open flyout\nmaui devflow ui tree --depth 3 --fields \"id,type,text\"    # find flyout items\nmaui devflow ui tap \u003CflyoutItemId>                        # tap item\nmaui devflow ui set-property \u003CshellId> FlyoutIsPresented \"false\"  # dismiss flyout\n",[8884],{"type":52,"tag":66,"props":8885,"children":8886},{"__ignoreMap":115},[8887,8895,8928,8965,8994,9045,9086],{"type":52,"tag":121,"props":8888,"children":8889},{"class":123,"line":124},[8890],{"type":52,"tag":121,"props":8891,"children":8892},{"style":217},[8893],{"type":57,"value":8894},"# Discover routes from XAML\n",{"type":52,"tag":121,"props":8896,"children":8897},{"class":123,"line":192},[8898,8902,8906,8910,8914,8918,8923],{"type":52,"tag":121,"props":8899,"children":8900},{"style":128},[8901],{"type":57,"value":536},{"type":52,"tag":121,"props":8903,"children":8904},{"style":133},[8905],{"type":57,"value":1327},{"type":52,"tag":121,"props":8907,"children":8908},{"style":159},[8909],{"type":57,"value":1332},{"type":52,"tag":121,"props":8911,"children":8912},{"style":133},[8913],{"type":57,"value":8109},{"type":52,"tag":121,"props":8915,"children":8916},{"style":159},[8917],{"type":57,"value":1342},{"type":52,"tag":121,"props":8919,"children":8920},{"style":133},[8921],{"type":57,"value":8922}," AppShell.xaml",{"type":52,"tag":121,"props":8924,"children":8925},{"style":217},[8926],{"type":57,"value":8927},"                              # find route names\n",{"type":52,"tag":121,"props":8929,"children":8930},{"class":123,"line":223},[8931,8935,8939,8943,8947,8951,8956,8960],{"type":52,"tag":121,"props":8932,"children":8933},{"style":128},[8934],{"type":57,"value":14},{"type":52,"tag":121,"props":8936,"children":8937},{"style":133},[8938],{"type":57,"value":619},{"type":52,"tag":121,"props":8940,"children":8941},{"style":133},[8942],{"type":57,"value":2197},{"type":52,"tag":121,"props":8944,"children":8945},{"style":133},[8946],{"type":57,"value":3205},{"type":52,"tag":121,"props":8948,"children":8949},{"style":159},[8950],{"type":57,"value":546},{"type":52,"tag":121,"props":8952,"children":8953},{"style":133},[8954],{"type":57,"value":8955},"\u002F\u002Fhome",{"type":52,"tag":121,"props":8957,"children":8958},{"style":159},[8959],{"type":57,"value":556},{"type":52,"tag":121,"props":8961,"children":8962},{"style":217},[8963],{"type":57,"value":8964},"                         # navigate to a route\n",{"type":52,"tag":121,"props":8966,"children":8967},{"class":123,"line":1008},[8968,8972,8976,8980,8984,8989],{"type":52,"tag":121,"props":8969,"children":8970},{"style":128},[8971],{"type":57,"value":14},{"type":52,"tag":121,"props":8973,"children":8974},{"style":133},[8975],{"type":57,"value":619},{"type":52,"tag":121,"props":8977,"children":8978},{"style":133},[8979],{"type":57,"value":2197},{"type":52,"tag":121,"props":8981,"children":8982},{"style":133},[8983],{"type":57,"value":3168},{"type":52,"tag":121,"props":8985,"children":8986},{"style":133},[8987],{"type":57,"value":8988}," FlyoutButton",{"type":52,"tag":121,"props":8990,"children":8991},{"style":217},[8992],{"type":57,"value":8993},"                          # open flyout\n",{"type":52,"tag":121,"props":8995,"children":8996},{"class":123,"line":1065},[8997,9001,9005,9009,9013,9017,9022,9027,9031,9036,9040],{"type":52,"tag":121,"props":8998,"children":8999},{"style":128},[9000],{"type":57,"value":14},{"type":52,"tag":121,"props":9002,"children":9003},{"style":133},[9004],{"type":57,"value":619},{"type":52,"tag":121,"props":9006,"children":9007},{"style":133},[9008],{"type":57,"value":2197},{"type":52,"tag":121,"props":9010,"children":9011},{"style":133},[9012],{"type":57,"value":8437},{"type":52,"tag":121,"props":9014,"children":9015},{"style":133},[9016],{"type":57,"value":8442},{"type":52,"tag":121,"props":9018,"children":9019},{"style":2665},[9020],{"type":57,"value":9021}," 3",{"type":52,"tag":121,"props":9023,"children":9024},{"style":133},[9025],{"type":57,"value":9026}," --fields",{"type":52,"tag":121,"props":9028,"children":9029},{"style":159},[9030],{"type":57,"value":546},{"type":52,"tag":121,"props":9032,"children":9033},{"style":133},[9034],{"type":57,"value":9035},"id,type,text",{"type":52,"tag":121,"props":9037,"children":9038},{"style":159},[9039],{"type":57,"value":556},{"type":52,"tag":121,"props":9041,"children":9042},{"style":217},[9043],{"type":57,"value":9044},"    # find flyout items\n",{"type":52,"tag":121,"props":9046,"children":9047},{"class":123,"line":1228},[9048,9052,9056,9060,9064,9068,9073,9077,9081],{"type":52,"tag":121,"props":9049,"children":9050},{"style":128},[9051],{"type":57,"value":14},{"type":52,"tag":121,"props":9053,"children":9054},{"style":133},[9055],{"type":57,"value":619},{"type":52,"tag":121,"props":9057,"children":9058},{"style":133},[9059],{"type":57,"value":2197},{"type":52,"tag":121,"props":9061,"children":9062},{"style":133},[9063],{"type":57,"value":3168},{"type":52,"tag":121,"props":9065,"children":9066},{"style":159},[9067],{"type":57,"value":1084},{"type":52,"tag":121,"props":9069,"children":9070},{"style":133},[9071],{"type":57,"value":9072},"flyoutItemI",{"type":52,"tag":121,"props":9074,"children":9075},{"style":1092},[9076],{"type":57,"value":2216},{"type":52,"tag":121,"props":9078,"children":9079},{"style":159},[9080],{"type":57,"value":1100},{"type":52,"tag":121,"props":9082,"children":9083},{"style":217},[9084],{"type":57,"value":9085},"                        # tap item\n",{"type":52,"tag":121,"props":9087,"children":9088},{"class":123,"line":1578},[9089,9093,9097,9101,9105,9109,9113,9117,9121,9125,9129,9133,9137],{"type":52,"tag":121,"props":9090,"children":9091},{"style":128},[9092],{"type":57,"value":14},{"type":52,"tag":121,"props":9094,"children":9095},{"style":133},[9096],{"type":57,"value":619},{"type":52,"tag":121,"props":9098,"children":9099},{"style":133},[9100],{"type":57,"value":2197},{"type":52,"tag":121,"props":9102,"children":9103},{"style":133},[9104],{"type":57,"value":2310},{"type":52,"tag":121,"props":9106,"children":9107},{"style":159},[9108],{"type":57,"value":1084},{"type":52,"tag":121,"props":9110,"children":9111},{"style":133},[9112],{"type":57,"value":8181},{"type":52,"tag":121,"props":9114,"children":9115},{"style":1092},[9116],{"type":57,"value":2216},{"type":52,"tag":121,"props":9118,"children":9119},{"style":159},[9120],{"type":57,"value":1100},{"type":52,"tag":121,"props":9122,"children":9123},{"style":133},[9124],{"type":57,"value":8194},{"type":52,"tag":121,"props":9126,"children":9127},{"style":159},[9128],{"type":57,"value":546},{"type":52,"tag":121,"props":9130,"children":9131},{"style":133},[9132],{"type":57,"value":8203},{"type":52,"tag":121,"props":9134,"children":9135},{"style":159},[9136],{"type":57,"value":556},{"type":52,"tag":121,"props":9138,"children":9139},{"style":217},[9140],{"type":57,"value":9141},"  # dismiss flyout\n",{"type":52,"tag":60,"props":9143,"children":9144},{},[9145],{"type":52,"tag":96,"props":9146,"children":9147},{},[9148],{"type":57,"value":9149},"Element inspection:",{"type":52,"tag":110,"props":9151,"children":9153},{"className":112,"code":9152,"language":114,"meta":115,"style":115},"maui devflow ui query --automationId \"MyControl\" --json --fields \"id,type,text,bounds\"\nmaui devflow ui element \u003Cid> --json\nmaui devflow ui property \u003Cid> Text\n",[9154],{"type":52,"tag":66,"props":9155,"children":9156},{"__ignoreMap":115},[9157,9214,9254],{"type":52,"tag":121,"props":9158,"children":9159},{"class":123,"line":124},[9160,9164,9168,9172,9176,9180,9184,9189,9193,9197,9201,9205,9210],{"type":52,"tag":121,"props":9161,"children":9162},{"style":128},[9163],{"type":57,"value":14},{"type":52,"tag":121,"props":9165,"children":9166},{"style":133},[9167],{"type":57,"value":619},{"type":52,"tag":121,"props":9169,"children":9170},{"style":133},[9171],{"type":57,"value":2197},{"type":52,"tag":121,"props":9173,"children":9174},{"style":133},[9175],{"type":57,"value":7705},{"type":52,"tag":121,"props":9177,"children":9178},{"style":133},[9179],{"type":57,"value":7559},{"type":52,"tag":121,"props":9181,"children":9182},{"style":159},[9183],{"type":57,"value":546},{"type":52,"tag":121,"props":9185,"children":9186},{"style":133},[9187],{"type":57,"value":9188},"MyControl",{"type":52,"tag":121,"props":9190,"children":9191},{"style":159},[9192],{"type":57,"value":556},{"type":52,"tag":121,"props":9194,"children":9195},{"style":133},[9196],{"type":57,"value":3047},{"type":52,"tag":121,"props":9198,"children":9199},{"style":133},[9200],{"type":57,"value":9026},{"type":52,"tag":121,"props":9202,"children":9203},{"style":159},[9204],{"type":57,"value":546},{"type":52,"tag":121,"props":9206,"children":9207},{"style":133},[9208],{"type":57,"value":9209},"id,type,text,bounds",{"type":52,"tag":121,"props":9211,"children":9212},{"style":159},[9213],{"type":57,"value":1062},{"type":52,"tag":121,"props":9215,"children":9216},{"class":123,"line":192},[9217,9221,9225,9229,9234,9238,9242,9246,9250],{"type":52,"tag":121,"props":9218,"children":9219},{"style":128},[9220],{"type":57,"value":14},{"type":52,"tag":121,"props":9222,"children":9223},{"style":133},[9224],{"type":57,"value":619},{"type":52,"tag":121,"props":9226,"children":9227},{"style":133},[9228],{"type":57,"value":2197},{"type":52,"tag":121,"props":9230,"children":9231},{"style":133},[9232],{"type":57,"value":9233}," element",{"type":52,"tag":121,"props":9235,"children":9236},{"style":159},[9237],{"type":57,"value":1084},{"type":52,"tag":121,"props":9239,"children":9240},{"style":133},[9241],{"type":57,"value":2211},{"type":52,"tag":121,"props":9243,"children":9244},{"style":1092},[9245],{"type":57,"value":2216},{"type":52,"tag":121,"props":9247,"children":9248},{"style":159},[9249],{"type":57,"value":1100},{"type":52,"tag":121,"props":9251,"children":9252},{"style":133},[9253],{"type":57,"value":3516},{"type":52,"tag":121,"props":9255,"children":9256},{"class":123,"line":223},[9257,9261,9265,9269,9273,9277,9281,9285,9289],{"type":52,"tag":121,"props":9258,"children":9259},{"style":128},[9260],{"type":57,"value":14},{"type":52,"tag":121,"props":9262,"children":9263},{"style":133},[9264],{"type":57,"value":619},{"type":52,"tag":121,"props":9266,"children":9267},{"style":133},[9268],{"type":57,"value":2197},{"type":52,"tag":121,"props":9270,"children":9271},{"style":133},[9272],{"type":57,"value":2202},{"type":52,"tag":121,"props":9274,"children":9275},{"style":159},[9276],{"type":57,"value":1084},{"type":52,"tag":121,"props":9278,"children":9279},{"style":133},[9280],{"type":57,"value":2211},{"type":52,"tag":121,"props":9282,"children":9283},{"style":1092},[9284],{"type":57,"value":2216},{"type":52,"tag":121,"props":9286,"children":9287},{"style":159},[9288],{"type":57,"value":1100},{"type":52,"tag":121,"props":9290,"children":9291},{"style":133},[9292],{"type":57,"value":9293}," Text\n",{"type":52,"tag":60,"props":9295,"children":9296},{},[9297],{"type":52,"tag":96,"props":9298,"children":9299},{},[9300],{"type":57,"value":9301},"State verification:",{"type":52,"tag":110,"props":9303,"children":9305},{"className":112,"code":9304,"language":114,"meta":115,"style":115},"maui devflow ui tap --automationId \"IncrementButton\"\nmaui devflow ui assert --automationId \"CounterLabel\" Text \"1\"\n",[9306],{"type":52,"tag":66,"props":9307,"children":9308},{"__ignoreMap":115},[9309,9345],{"type":52,"tag":121,"props":9310,"children":9311},{"class":123,"line":124},[9312,9316,9320,9324,9328,9332,9336,9341],{"type":52,"tag":121,"props":9313,"children":9314},{"style":128},[9315],{"type":57,"value":14},{"type":52,"tag":121,"props":9317,"children":9318},{"style":133},[9319],{"type":57,"value":619},{"type":52,"tag":121,"props":9321,"children":9322},{"style":133},[9323],{"type":57,"value":2197},{"type":52,"tag":121,"props":9325,"children":9326},{"style":133},[9327],{"type":57,"value":3168},{"type":52,"tag":121,"props":9329,"children":9330},{"style":133},[9331],{"type":57,"value":7559},{"type":52,"tag":121,"props":9333,"children":9334},{"style":159},[9335],{"type":57,"value":546},{"type":52,"tag":121,"props":9337,"children":9338},{"style":133},[9339],{"type":57,"value":9340},"IncrementButton",{"type":52,"tag":121,"props":9342,"children":9343},{"style":159},[9344],{"type":57,"value":1062},{"type":52,"tag":121,"props":9346,"children":9347},{"class":123,"line":192},[9348,9352,9356,9360,9364,9368,9372,9377,9381,9385,9389,9394],{"type":52,"tag":121,"props":9349,"children":9350},{"style":128},[9351],{"type":57,"value":14},{"type":52,"tag":121,"props":9353,"children":9354},{"style":133},[9355],{"type":57,"value":619},{"type":52,"tag":121,"props":9357,"children":9358},{"style":133},[9359],{"type":57,"value":2197},{"type":52,"tag":121,"props":9361,"children":9362},{"style":133},[9363],{"type":57,"value":7898},{"type":52,"tag":121,"props":9365,"children":9366},{"style":133},[9367],{"type":57,"value":7559},{"type":52,"tag":121,"props":9369,"children":9370},{"style":159},[9371],{"type":57,"value":546},{"type":52,"tag":121,"props":9373,"children":9374},{"style":133},[9375],{"type":57,"value":9376},"CounterLabel",{"type":52,"tag":121,"props":9378,"children":9379},{"style":159},[9380],{"type":57,"value":556},{"type":52,"tag":121,"props":9382,"children":9383},{"style":133},[9384],{"type":57,"value":7912},{"type":52,"tag":121,"props":9386,"children":9387},{"style":159},[9388],{"type":57,"value":546},{"type":52,"tag":121,"props":9390,"children":9391},{"style":133},[9392],{"type":57,"value":9393},"1",{"type":52,"tag":121,"props":9395,"children":9396},{"style":159},[9397],{"type":57,"value":1062},{"type":52,"tag":9399,"props":9400,"children":9401},"style",{},[9402],{"type":57,"value":9403},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":9405,"total":9504},[9406,9422,9435,9447,9464,9481,9497],{"slug":9407,"name":9407,"fn":9408,"description":9409,"org":9410,"tags":9411,"stars":25,"repoUrl":26,"updatedAt":9421},"android-slim-bindings","create Android slim bindings for .NET","Create Android slim bindings for MAUI\u002F.NET Android. USE FOR: slim Android binding, Kotlin\u002FJava wrappers, build.gradle.kts, Maven, AAR\u002FJAR, AndroidMavenLibrary, AndroidLibrary, @JvmStatic, XA4241\u002FXA4242, Xamarin.AndroidX\u002FKotlin NuGets. DO NOT USE FOR: iOS\u002FmacOS bindings, general MAUI apps, or NuGet packaging.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9412,9413,9414,9417,9420],{"name":17,"slug":18,"type":15},{"name":6767,"slug":32,"type":15},{"name":9415,"slug":9416,"type":15},"Java","java",{"name":9418,"slug":9419,"type":15},"Kotlin","kotlin",{"name":20,"slug":21,"type":15},"2026-07-12T08:22:54.006105",{"slug":9423,"name":9423,"fn":9424,"description":9425,"org":9426,"tags":9427,"stars":25,"repoUrl":26,"updatedAt":9434},"devflow-automation","automate .NET MAUI app state","Automate MAUI app state through DevFlow Actions. USE FOR: `[DevFlowAction]` shortcuts, login, seed data, deep screens. DO NOT USE FOR: arbitrary methods, DI internals, UI MCP tools, connectivity, or build\u002Fdeploy issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9428,9429,9432,9433],{"name":17,"slug":18,"type":15},{"name":9430,"slug":9431,"type":15},"Automation","automation",{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:22:56.616564",{"slug":9436,"name":9436,"fn":9437,"description":9438,"org":9439,"tags":9440,"stars":25,"repoUrl":26,"updatedAt":9446},"devflow-connect","diagnose DevFlow agent connectivity issues","Diagnose DevFlow agent connectivity. USE FOR: `maui devflow` connection failures, agent not found, ports, adb forwarding, broker. DO NOT USE FOR: build failures, setup, visual tree, or Blazor CDP.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9441,9442,9443],{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":9444,"slug":9445,"type":15},"Networking","networking","2026-07-12T08:22:48.847431",{"slug":9448,"name":9448,"fn":9449,"description":9450,"org":9451,"tags":9452,"stars":25,"repoUrl":26,"updatedAt":9463},"dotnet-workload-info","discover MAUI workload metadata","Discover MAUI workload metadata from live NuGet APIs. USE FOR: workload manifest lookup, WorkloadDependencies.json, v3-flatcontainer, CLI-to-NuGet version conversion, Xcode\u002FJDK\u002FAndroid SDK requirements, CI sdkmanager packages, `packageid:Microsoft.Maui.Controls`. DO NOT USE FOR: installing workloads, build debugging, or app version edits.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9453,9456,9459,9462],{"name":9454,"slug":9455,"type":15},"C#","csharp",{"name":9457,"slug":9458,"type":15},"CLI","cli",{"name":9460,"slug":9461,"type":15},"Engineering","engineering",{"name":13,"slug":14,"type":15},"2026-07-12T08:22:46.318953",{"slug":9465,"name":9465,"fn":9466,"description":9467,"org":9468,"tags":9469,"stars":25,"repoUrl":26,"updatedAt":9480},"ios-slim-bindings","create iOS slim bindings for MAUI","Create iOS slim bindings for MAUI. USE FOR: slim iOS binding, Native Library Interop, Swift\u002FObjective-C wrappers, XcodeGen project.yml, Podfile, CocoaPods static linking, BUILD_LIBRARY_FOR_DISTRIBUTION, XcodeProject MSBuild, `@objc`\u002F`[Export]` selector crashes, async completion handlers. DO NOT USE FOR: Android bindings, general MAUI apps, or NuGet packaging.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9470,9471,9473,9474,9477],{"name":17,"slug":18,"type":15},{"name":9472,"slug":34,"type":15},"iOS",{"name":13,"slug":14,"type":15},{"name":9475,"slug":9476,"type":15},"Swift","swift",{"name":9478,"slug":9479,"type":15},"Xcode","xcode","2026-07-12T08:22:50.128667",{"slug":9482,"name":9482,"fn":9483,"description":9484,"org":9485,"tags":9486,"stars":25,"repoUrl":26,"updatedAt":9496},"maui-accessibility","implement accessibility in .NET MAUI apps","Make .NET MAUI apps accessible with semantic properties, screen reader labels\u002Fhints, heading levels, focus, announcements, AutomationProperties, touch targets, and platform checks. USE FOR: accessibility audits, WCAG UI fixes, TalkBack\u002FVoiceOver\u002FNarrator behavior, SemanticProperties.Description\u002FHint\u002FHeadingLevel, SemanticScreenReader.Announce, SetSemanticFocus, avoiding redundant Label metadata, hiding decorative content with IsInAccessibleTree=false, and CollectionView row semantics. DO NOT USE FOR: general layout, UI automation only, or performance tuning.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9487,9488,9491,9492,9493],{"name":17,"slug":18,"type":15},{"name":9489,"slug":9490,"type":15},"Accessibility","accessibility",{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":9494,"slug":9495,"type":15},"WCAG","wcag","2026-07-12T08:22:17.823583",{"slug":4,"name":4,"fn":5,"description":6,"org":9498,"tags":9499,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9500,9501,9502,9503],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},32,{"items":9506,"total":9661},[9507,9521,9536,9548,9564,9578,9595,9605,9617,9627,9640,9651],{"slug":9508,"name":9508,"fn":9509,"description":9510,"org":9511,"tags":9512,"stars":9518,"repoUrl":9519,"updatedAt":9520},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9513,9514,9515],{"name":17,"slug":18,"type":15},{"name":9460,"slug":9461,"type":15},{"name":9516,"slug":9517,"type":15},"Performance","performance",5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":9522,"name":9522,"fn":9523,"description":9524,"org":9525,"tags":9526,"stars":9533,"repoUrl":9534,"updatedAt":9535},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9527,9528,9531,9532],{"name":17,"slug":18,"type":15},{"name":9529,"slug":9530,"type":15},"Code Analysis","code-analysis",{"name":23,"slug":24,"type":15},{"name":9516,"slug":9517,"type":15},4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-12T08:23:25.400375",{"slug":9537,"name":9537,"fn":9538,"description":9539,"org":9540,"tags":9541,"stars":9533,"repoUrl":9534,"updatedAt":9547},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9542,9543,9544,9545],{"name":17,"slug":18,"type":15},{"name":6767,"slug":32,"type":15},{"name":23,"slug":24,"type":15},{"name":9546,"slug":37,"type":15},"Microsoft","2026-07-12T08:23:21.595572",{"slug":9549,"name":9549,"fn":9550,"description":9551,"org":9552,"tags":9553,"stars":9533,"repoUrl":9534,"updatedAt":9563},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9554,9555,9556,9557,9560],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":9472,"slug":34,"type":15},{"name":9558,"slug":9559,"type":15},"macOS","macos",{"name":9561,"slug":9562,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":9565,"name":9565,"fn":9566,"description":9567,"org":9568,"tags":9569,"stars":9533,"repoUrl":9534,"updatedAt":9577},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9570,9571,9574],{"name":9529,"slug":9530,"type":15},{"name":9572,"slug":9573,"type":15},"QA","qa",{"name":9575,"slug":9576,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":9579,"name":9579,"fn":9580,"description":9581,"org":9582,"tags":9583,"stars":9533,"repoUrl":9534,"updatedAt":9594},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9584,9585,9587,9588,9591],{"name":17,"slug":18,"type":15},{"name":412,"slug":9586,"type":15},"blazor",{"name":9454,"slug":9455,"type":15},{"name":9589,"slug":9590,"type":15},"UI Components","ui-components",{"name":9592,"slug":9593,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":9596,"name":9596,"fn":9597,"description":9598,"org":9599,"tags":9600,"stars":9533,"repoUrl":9534,"updatedAt":9604},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9601,9602,9603],{"name":9529,"slug":9530,"type":15},{"name":23,"slug":24,"type":15},{"name":9546,"slug":37,"type":15},"2026-07-12T08:21:34.637923",{"slug":9606,"name":9606,"fn":9607,"description":9608,"org":9609,"tags":9610,"stars":9533,"repoUrl":9534,"updatedAt":9616},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9611,9614,9615],{"name":9612,"slug":9613,"type":15},"Build","build",{"name":23,"slug":24,"type":15},{"name":9460,"slug":9461,"type":15},"2026-07-19T05:38:19.340791",{"slug":9618,"name":9618,"fn":9619,"description":9620,"org":9621,"tags":9622,"stars":9533,"repoUrl":9534,"updatedAt":9626},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9623,9624,9625],{"name":17,"slug":18,"type":15},{"name":9460,"slug":9461,"type":15},{"name":9516,"slug":9517,"type":15},"2026-07-19T05:38:18.364937",{"slug":9628,"name":9628,"fn":9629,"description":9630,"org":9631,"tags":9632,"stars":9533,"repoUrl":9534,"updatedAt":9639},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9633,9634,9637,9638],{"name":9460,"slug":9461,"type":15},{"name":9635,"slug":9636,"type":15},"Monitoring","monitoring",{"name":9516,"slug":9517,"type":15},{"name":9575,"slug":9576,"type":15},"2026-07-12T08:21:35.865649",{"slug":9641,"name":9641,"fn":9642,"description":9643,"org":9644,"tags":9645,"stars":9533,"repoUrl":9534,"updatedAt":9650},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9646,9647,9648,9649],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":9460,"slug":9461,"type":15},{"name":9516,"slug":9517,"type":15},"2026-07-12T08:21:40.961722",{"slug":9652,"name":9652,"fn":9653,"description":9654,"org":9655,"tags":9656,"stars":9533,"repoUrl":9534,"updatedAt":9660},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[9657,9658,9659],{"name":23,"slug":24,"type":15},{"name":9460,"slug":9461,"type":15},{"name":9572,"slug":9573,"type":15},"2026-07-19T05:38:14.336279",144]