skills/designer-runtime/SKILL.md
Use this when a designer needs to pilot an ad-hoc iOS simulator directly, launch Flutter from their own worktree in tmux, or trigger hot reload without the broker/device-harness path.
npx skillsauth add robertmsale/.codex designer-runtimeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill for designers and QA agents working directly from an assigned worktree and simulator.
Use only these scripts:
designer-drive ...
designer-crop-screenshot ...
designer-flutter-run ...
designer-flutter-stop ...
designer-hot-reload ...
designer-drive
idb commands plus small Python HID helpers for text editing casesdesigner-drive screenshot surface, falls back to simulator-native capture if idb bitmap capture is unavailable, normalizes the saved image to the live UI orientation, and can crop directly to a live accessibility selectorautomation.orientationBeacon, tap, swipe, and screenshot orientation use that accessibility sentinel instead of probe-based orientation guessingdesigner-flutter-run
flutter run -d <UDID> in a tmux session from the designer worktreedesigner-hot-reload
r to the tmux session running Flutterdesigner-flutter-stop
designer-flutter-rundesigner-crop-screenshot
flutter-sim or the managed reservation path here.designer-drive must not rely on broker reservations, thread identity, mutagen lane setup, or managed runtime metadata.&&, ||, ;, pipes, command substitution, or inline env wrappers when operating this tooling.designer-drive screenshot --selector ... if a live accessibility frame is enough.designer-crop-screenshot when you need manual boxes, presets, percentages, or to crop an existing saved image.designer-flutter-run --session designer-app --device-id <UDID> --workdir <worktree_path>designer-drive hierarchy --device-id <UDID>designer-drive command tapOn --device-id <UDID> --input '{"text":"Settings"}'designer-drive screenshot --device-id <UDID> --selector '{"id":"node-style-minimal-flat"}' --out minimal-flat.pngdesigner-crop-screenshot --input current.png --preset bottom_safe_area --out current-bottomsafe.pngdesigner-hot-reload --session designer-appdesigner-flutter-stop --session designer-appdesigner-drive command launchApp --device-id <UDID>designer-flutter-stop --session designer-appdesigner-drive command resetApp --device-id <UDID>designer-flutter-run --session designer-app --device-id <UDID> --workdir <worktree_path> -- <dart defines>designer-driveUsage shape:
designer-drive [global-options] <subcommand> [subcommand-options]
Important:
--app-id and --json go before apps, hierarchy, command, flow, and so on.--selector '{"id":"node-style-minimal-flat"}'.designer-drive screenshot are normalized to the live UI orientation before they are saved or cropped.automation.orientationBeacon and value <orientation>|<width>|<height>, for example landscapeLeft|1366|1024.portraitUp, portraitDown, landscapeLeft, and landscapeRight.Commands:
designer-drive devices
designer-drive apps --device-id <UDID>
designer-drive hierarchy --device-id <UDID>
designer-drive screenshot --device-id <UDID> --out current.png
designer-drive screenshot --device-id <UDID> --selector '{"id":"node-style-minimal-flat"}' --out minimal-flat.png
designer-drive command <name> --device-id <UDID> [--input <json>] [--label <text>] [--out <file>]
designer-drive flow --device-id <UDID> --input <json-array> [--label <text>]
Use devices to list booted simulators visible to idb. All other commands target the UDID you were given. designer-drive uses the current working directory internally; designers should not need to pass a worktree path just to pilot a device.
Common examples:
designer-drive devices
designer-drive hierarchy --device-id <UDID>
designer-drive command tapOn --device-id <UDID> --input '{"text":"Continue"}'
designer-drive screenshot --device-id <UDID> --selector '{"text":"Close"}' --out close-button.png
designer-drive command clearAndInputText --device-id <UDID> --input 'New title'
designer-drive command takeScreenshot --device-id <UDID> --out current.png
designer-hot-reload --session designer-app
Useful command names:
launchAppterminateAppresetApptapOnlongPressOninputTextclearAndInputTexteraseTextforwardEraseTexthideKeyboardswipetakeScreenshotRecommended operating pattern:
designer-flutter-run.designer-drive devices and confirm the target UDID.designer-drive hierarchy --device-id <UDID> to inspect the current screen.hierarchy or takeScreenshot to verify the result.designer-drive screenshot --selector ....designer-crop-screenshot.designer-hot-reload --session <session>.designer-flutter-runUsage shape:
designer-flutter-run --session <tmux-session> --device-id <UDID> [--workdir <path>] [--target <dart-file>] [--flavor <flavor>] [--log <path>] [-- <flutter args>...]
Examples:
designer-flutter-run --session designer-app --device-id <UDID> --workdir <worktree_path>
designer-flutter-run --session designer-app --device-id <UDID> --workdir <worktree_path> --log /tmp/designer-app.log
designer-flutter-run --session designer-app --device-id <UDID> --workdir <worktree_path> -- --dart-define=FOO=bar
Notes:
--help prints the supported flags./tmp/designer-flutter-run/<session>.log.designer-flutter-run is the sanctioned path for Flutter debug launching; raw flutter run remains blocked by the Flutter shim.tmux list-sessions no longer shows the session, inspect the log before retrying.flutter run unless the operator explicitly asks for a one-off diagnostic path.designer-crop-screenshotUse this when you need a stable screenshot region for bottom safe-area checks, header blur comparisons, or before/after diffs.
If a single live selector crop is enough, prefer designer-drive screenshot --selector ... first.
Selector mode uses selector JSON, for example --selector '{"text":"Close"}'.
Usage shape:
designer-crop-screenshot --input <image.png> --out <crop.png> [crop-mode-options]
Selector mode from live hierarchy:
designer-crop-screenshot --input shot.png --device-id <UDID> --selector '{"id":"node-style-minimal-flat"}' --out minimal-flat.png
designer-crop-screenshot --input shot.png --device-id <UDID> --selector '{"text":"Close"}' --out close-button.png
Exact pixel box:
designer-crop-screenshot --input shot.png --x 0 --y 2400 --width 2048 --height 332 --out bottom-strip.png
Percentage + anchor:
designer-crop-screenshot --input shot.png --anchor bottom_center --width-pct 100 --height-pct 12 --out bottom-safe.png
designer-crop-screenshot --input shot.png --anchor top_right --width-pct 25 --height-pct 20 --offset-x -24 --out top-right.png
Preset mode:
designer-crop-screenshot --input shot.png --preset header --out header.png
designer-crop-screenshot --input shot.png --preset bottom_right --out bottom-right.png
designer-crop-screenshot --input shot.png --preset bottom_safe_area --out bottom-safe.png
Supported anchors:
top_lefttop_centertop_rightcenter_leftcentercenter_rightbottom_leftbottom_centerbottom_rightSupported presets:
bottom_rightheadercentertop_rightbottom_safe_areaNotes:
designer-drive hierarchy.designer-drive screenshot --selector ... when that covers the review.designer-crop-screenshot when you need a second explicit crop step.development
Use this when QA is piloting product goals, golden paths, simulator flows, or workflow-scale usability for a real user persona.
development
Use for orchestrating or executing screenshot-driven Flutter redesign work where workers generate reference images, capture atomic Design Lab Bun/WebView proof when available, run visual design review, and implement only after visual approval. [skill-hash:2c4d9f0]
content-media
Ran into a sandbox issue, approval request, or privileged-exec rejection? Use this skill immediately for the sanctioned resolution path. [skill-hash:b8f4a20]
tools
Use Robdex communication via `robdex`, including role-scoped Requirements workflows. Role behavior lives in the base instructions. [skill-hash:8f2c6a9]