android-emulator-harne…
Bring up an Android app in a headless emulator on Linux/WSL and drive it for automated integration testing, the Android analog of…
Make a mobile app driveable AND auditable through the accessibility tree, the shared dependency behind every tap-by-label interaction. One tree, two consumers reading different fields: driving reads the stable handle (testID -> accessibilityIdentifier); auditing reads the
Claude Code
$ npx -y skills add simiancraft/simiancraft-skills --skill mobile-accessibility --agent claude-code
Codex
$ npx skills add simiancraft/simiancraft-skills --skill mobile-accessibility -a codex -y
Cursor
$ npx skills add simiancraft/simiancraft-skills --skill mobile-accessibility -a cursor -y
Gemini CLI
$ npx skills add simiancraft/simiancraft-skills --skill mobile-accessibility -a gemini-cli -y
GitHub Copilot
$ npx skills add simiancraft/simiancraft-skills --skill mobile-accessibility -a github-copilot -y
OpenCode
$ npx skills add simiancraft/simiancraft-skills --skill mobile-accessibility -a opencode -y
Windsurf
$ npx skills add simiancraft/simiancraft-skills --skill mobile-accessibility -a windsurf -y
name: mobile-accessibility description: >- Make a mobile app driveable AND auditable through the accessibility tree, the shared dependency behind every tap-by-label interaction. One tree, two consumers reading different fields: driving reads the stable handle (testID -> accessibilityIdentifier); auditing reads the user-facing semantics (label, role, state, focus order). Covers iOS-native (UIAccessibility) and React Native / Expo (accessibilityLabel/role/state/accessible + testID) and how RN maps to the native tree. Prefer accessibility over coordinates. Referenced by ios-simulator and expo-ios-simulator for driving, and by the auditing skills for completeness. status: complete sources: - https://reactnative.dev/docs/accessibility (the React Native accessibility props) - https://reactnative.dev/docs/view (testID: "Used to locate this view in end-to-end tests") - https://developer.apple.com/documentation/uikit/uiaccessibilityidentification/accessibilityidentifier (the automation handle, distinct from the label) - https://developer.apple.com/documentation/uikit/uiaccessibilityelement/accessibilitylabel (the user-facing name)
Why its own skill: the same tags serve two consumers (driving vs auditing); owning them here keeps both DRY. Driving skills read the handle; auditing skills read the semantics.
An accessible app exposes an **accessibility tree**: a hierarchy of elements that assistive technology (VoiceOver) navigates, and that an automation driver (AXe) reads to find and tap things. Every element can carry a few fields. Two of them matter most, and they exist for **different** reasons:
| Field (iOS) | React Native prop | Who reads it | What it is for | |---|---|---|---| | `accessibilityIdentifier` | `testID` | the **driver** | a stable **handle** to find an element in a script | | `accessibilityLabel` | `accessibilityLabel` | the **human** (VoiceOver) and the **auditor** | the element's **name**, spoken aloud |
Apple draws this line itself: an identifier lets a script *"uniquely identify an element"* and thereby *"avoid inappropriately setting or accessing an element's accessibility label"* (`accessibilityIdentifier` docs). React Native's `testID` is the same idea from the other side: *"Used to locate this view in end-to-end tests."* The label, by contrast, is *"a string that succinctly identifies the accessibility element"* for a user; Apple's example is "Save," not "Save button."
So:
change when copy, locale, or layout changes. Tapping by visible label is the fallback when no handle exists. Coordinates are the last resort (brittle; see **ios-simulator** `references/driving.md`).
state (disabled, selected, checked) correct, is the focus order sane.
Native, or AXe's own help); a prior-art skill is never a source.
Web a11y -> future web-accessibility. Cross-platform auditing -> future accessibility. Android specifics -> android-emulator-harness lineage.
Claude Code skills for the full arc of a change: farm to table, with receipts. Curated Claude Code skills and agents from simiancraft. Most skill collections are grab bags. This one has a spine: it carries a change through its whole life.
Bring up an Android app in a headless emulator on Linux/WSL and drive it for automated integration testing, the Android analog of…
Specialization of android-emulator-harness for CAMERA / segmentation testing: get a real PERSON in front of the emulator camera…
Appraise a GitHub issue backlog unattended: for each issue, decide whether it is still real and how big it is, then apply the…
Shrink a media asset to the smallest bytes that still serve its purpose, keyed on asset kind (raster, vector, animation, video,…
Run an unattended burndown of a GitHub issue backlog as cards on a per-operator GitHub Projects board whose lanes are an explicit…
Break one GitHub issue that is too large to work into sub-issues, unattended, and keep the carving honest as the children close.…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.