iOS Simulator Skill
conorluddy/ios-simulator-skill
29 production-ready scripts for iOS app testing, building, and automation.
Guides WCAG 2.1 and VoiceOver accessibility testing for iOS apps, working from the accessibility tree and not from screenshots.
$ npx skills add conorluddy/xclaude-plugin --skill accessibility-testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install conorluddy/xclaude-plugin accessibility-testing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/accessibility-testing .claude/skills/accessibility-testing && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "accessibility-testing" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/accessibility-testing into .claude/skills/accessibility-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "accessibility-testing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/conorluddy/xclaude-plugin/tree/main/skills/accessibility-testingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add conorluddy/xclaude-plugin --skill accessibility-testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install conorluddy/xclaude-plugin accessibility-testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/accessibility-testing .agents/skills/accessibility-testing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "accessibility-testing" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/accessibility-testing into .agents/skills/accessibility-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "accessibility-testing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add conorluddy/xclaude-plugin --skill accessibility-testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install conorluddy/xclaude-plugin accessibility-testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/accessibility-testing .cursor/skills/accessibility-testing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "accessibility-testing" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/accessibility-testing into .cursor/skills/accessibility-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "accessibility-testing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/conorluddy/xclaude-plugin.git --path skills/accessibility-testing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add conorluddy/xclaude-plugin --skill accessibility-testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install conorluddy/xclaude-plugin accessibility-testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/accessibility-testing .gemini/skills/accessibility-testing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "accessibility-testing" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/accessibility-testing into .gemini/skills/accessibility-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "accessibility-testing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install conorluddy/xclaude-plugin accessibility-testingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add conorluddy/xclaude-plugin --skill accessibility-testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/accessibility-testing .github/skills/accessibility-testing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "accessibility-testing" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/accessibility-testing into .github/skills/accessibility-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "accessibility-testing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add conorluddy/xclaude-plugin --skill accessibility-testing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install conorluddy/xclaude-plugin accessibility-testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/accessibility-testing .opencode/skills/accessibility-testing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "accessibility-testing" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/accessibility-testing into .opencode/skills/accessibility-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "accessibility-testing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
accessibility-testingGuides WCAG 2.1 and VoiceOver accessibility testing for iOS apps, working from the accessibility tree and not from screenshots.
The central principle is that the accessibility tree is the primary testing interface. It shows what screen readers see: structure and relationships, focus order, element roles and states, and text alternatives. The skill calls this faster and more dependable than visual inspection and keeps screenshots as a fallback. Its quick reference lists the tools to use: `accessibility-quality-check` for a quality pass, `idb-ui-describe` for the full tree and `idb-ui-find-element` to locate an element by label, with VoiceOver checks done manually.
It explains the WCAG 2.1 levels A, AA and AAA, including contrast ratios of 4.5 to 1 for normal text and 3 to 1 for large text and text that resizes up to 200 percent. It also covers VoiceOver testing patterns, Dynamic Type, keyboard navigation and focus management, semantic markup, running audits in CI and CD, and common violations with their fixes.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 6de4b2c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are swift and json).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
iOS Accessibility Testing loads about 5k tokens when it runs. Until then it costs about 86 tokens; SKILL.md has 1,304 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from conorluddy/xclaude-plugin at commit 6de4b2c, republished under its MIT licence (© conorluddy). 1,304 words, ~5,009 tokens.
.claude/skills/accessibility-testing/SKILL.md (or your agent's skills folder).WCAG compliance and accessibility quality assurance for iOS applications
This skill teaches accessibility-first testing strategies for iOS apps. Accessibility testing ensures apps are usable by everyone, including people with disabilities. It combines automated validation of accessibility metadata with manual verification of user experience patterns.
Why accessibility testing matters:
Use this skill when:
This skill covers:
| Task | Tool/Operation | Typical Time |
|---|---|---|
| Check accessibility quality | accessibility-quality-check | ~80ms |
| Query full accessibility tree | idb-ui-describe | ~120ms |
| Find element by label | idb-ui-find-element | ~100ms |
| Screenshot (fallback only) | screenshot | ~2000ms |
| VoiceOver simulation | Manual testing | - |
The accessibility tree IS your primary testing interface.
Unlike visual testing (screenshots), the accessibility tree reveals:
3-4x faster and more reliable than visual inspection.
Level A (Minimum):
Level AA (Recommended):
Level AAA (Enhanced):
Target Level AA for most apps.
Essential Properties:
accessibilityLabel: What element is
accessibilityValue: Current state/value
accessibilityHint: What happens when activated
accessibilityTraits: Element behavior
isAccessibilityElement: Should be exposed
true for interactive/informative elementsfalse for decorative elementsAccessibility tree is semantic, not visual:
Visual UI:
┌─────────────────┐
│ [img] John Doe │ ← Visual: Image + Text
│ Online │
└─────────────────┘
Accessibility Tree:
• Button: "John Doe, Online, Profile" ← Single focusable element
- label: "John Doe"
- value: "Online"
- hint: "Opens profile"
- traits: [Button]Good accessibility = logical semantic structure.
Start here to assess app's accessibility implementation:
{
"operation": "check-accessibility",
"target": "booted"
}Interprets accessibility tree quality:
Decision tree:
excellent/good → Proceed with accessibility-first testing
fair → Test but expect to find issues
poor → Major remediation needed
insufficient → App may not support assistive techNote: Most modern iOS apps score "good" or "excellent".
Core operation for all accessibility testing:
{
"operation": "describe",
"target": "booted",
"parameters": {
"operation": "all"
}
}Returns complete accessibility tree:
{
"elements": [
{
"label": "Login",
"type": "Button",
"frame": { "x": 100, "y": 400, "width": 175, "height": 50 },
"enabled": true,
"visible": true,
"traits": ["Button"],
"value": null,
"hint": "Sign in to your account"
},
{
"label": "Email address",
"type": "TextField",
"value": "",
"frame": { "x": 50, "y": 300, "width": 275, "height": 44 },
"enabled": true,
"visible": true,
"traits": ["TextField"]
}
]
}Analyze for:
Find and verify accessibility of specific UI elements:
{
"operation": "find-element",
"target": "booted",
"parameters": {
"query": "Submit button"
}
}Validates:
Verify logical focus order:
Focus order issues:
Bad: [Button: Cancel] → [Image: Decorative] → [Button: Submit] → [TextField]
Good: [TextField] → [Button: Submit] → [Button: Cancel]All non-text content needs text alternative:
Query accessibility tree for all images
For each image:
✓ Has accessibilityLabel
✓ Label describes image content
✓ Or marked as decorative (isAccessibilityElement: false)Common violations:
Fix:
// Bad
imageView.isAccessibilityElement = true // No label
// Good
imageView.isAccessibilityElement = true
imageView.accessibilityLabel = "Profile photo of John Doe"
// Decorative (best if truly decorative)
imageView.isAccessibilityElement = falseAll functionality available via sequential navigation:
Query accessibility tree
Verify elements appear in logical order:
✓ Top to bottom
✓ Left to right
✓ Grouped logically
✓ Interactive elements are focusable
✓ Decorative elements are not focusableTest pattern:
1. describe → Get all elements
2. Map order: element[0], element[1], element[2]...
3. Verify order matches visual/logical flow
4. Check no important elements missingMinimum contrast requirements:
Testing approach:
1. screenshot → Capture current screen
2. Use color picker to sample text/background
3. Calculate contrast ratio: (L1 + 0.05) / (L2 + 0.05)
4. Verify meets WCAG AA (4.5:1 or 3:1)Common violations:
Note: Screenshots are appropriate for contrast testing (color-based).
All inputs have clear labels:
Query accessibility tree
For each TextField/input element:
✓ Has accessibilityLabel
✓ Label describes purpose
✓ Label visible or programmatically associated
✓ Required fields indicated
✓ Format instructions provided if neededGood labels:
{
"type": "TextField",
"label": "Email address",
"hint": "Enter your email to sign in",
"value": ""
}Bad labels:
{
"type": "TextField",
"label": "TextField", // Generic
"value": ""
}Text scales from 100% to 200%:
Test pattern:
1. Set Dynamic Type to smallest size
2. Launch app, screenshot, verify readable
3. Set Dynamic Type to largest size
4. Launch app, screenshot, verify:
✓ Text scales appropriately
✓ No text truncation
✓ Layout adapts
✓ Buttons still tappableSettings locations:
VoiceOver announces elements in accessibility tree order:
1. describe → Get accessibility tree
2. For each element (in order):
- Announces: [label] [value] [traits] [hint]
- Example: "Submit button, button, Sign in to your account"
3. Verify announcements are:
✓ Clear and descriptive
✓ Not redundant
✓ Appropriate detail levelAnnouncement structure:
"[label], [type], [value], [hint]"
Examples:
"Profile photo, image, image of John Doe"
"Volume, slider, 50%, adjustable"
"Send, button, button, Sends your message"1. Verbose Announcements
Bad: "Submit button, button, Click here to submit the form"
Good: "Submit, button"Fix: Remove redundant "button" from label, concise hint.
2. Missing Context
Bad: "Edit, button" (which item?)
Good: "Edit profile photo, button"Fix: Include context in label.
3. Confusing Order
Visual: [Title] [Close button]
[Content]
VoiceOver: Close button → Content → Title ❌Fix: Adjust accessibility container order or element grouping.
4. No Label
Element visible, but:
- isAccessibilityElement: false (should be true)
- Or no accessibilityLabelFix: Set both properties appropriately.
Detection:
Query accessibility tree
Find elements with type: "Image"
Check if label is missing or genericSymptoms:
Fix:
imageView.isAccessibilityElement = true
imageView.accessibilityLabel = "Descriptive text"
// Or if decorative:
imageView.isAccessibilityElement = falseDetection:
Query accessibility tree
Find elements with traits: ["Button"]
Check if label is missing or just "button"Symptoms:
Fix:
button.accessibilityLabel = "Send message"
// Avoid: button.accessibilityLabel = "Send message button" // RedundantDetection:
Screenshot → Sample colors
Calculate contrast ratio
Compare to WCAG standardsSymptoms:
Fix:
// Increase contrast
label.textColor = .label // System adapts to dark mode
// Or explicit colors with sufficient contrast
label.textColor = UIColor(white: 0.2, alpha: 1.0) // Dark gray on whiteDetection:
Check if functionality requires:
- Multi-finger gestures
- Precise timing
- Specific swipe patternsSymptoms:
Fix:
// Provide alternative single-tap interaction
// Or use standard UIControl components
// Avoid custom gesture-only interfacesDetection:
Query accessibility tree
Find elements with traits: ["Link"]
Check if label is generic: "click here", "read more"Symptoms:
Fix:
// Bad
link.accessibilityLabel = "Click here"
// Good
link.accessibilityLabel = "Read our privacy policy"Test accessibility of error states:
1. describe → Get form elements
2. Submit invalid form
3. describe → Check error state
4. Verify:
✓ Error messages have labels
✓ Associated with relevant field
✓ Clear instructions for fixing
✓ Focus moves to first errorGood error accessibility:
{
"type": "TextField",
"label": "Email address",
"value": "invalid",
"traits": ["TextField"],
"hint": "Invalid email format. Example: user@example.com"
}Test when content updates:
1. describe → Get initial state
2. Trigger update (load more, filter, etc.)
3. describe → Get new state
4. Verify:
✓ New content has labels
✓ Loading states announced
✓ Focus managed appropriately
✓ No duplicate announcementsUse accessibility notifications:
// Announce completion
UIAccessibility.post(notification: .announcement,
argument: "10 new messages loaded")
// Or move focus to new content
UIAccessibility.post(notification: .layoutChanged,
argument: firstNewElement)Test focus management:
1. describe → Get main screen elements
2. Open modal
3. describe → Get modal elements
4. Verify:
✓ Focus trapped in modal
✓ Background content not accessible
✓ Close button clearly labeled
✓ Modal has accessible title
5. Close modal
6. describe → Verify focus returns appropriatelyTest large scrollable content:
For each page/section:
1. describe → Get visible elements
2. Verify logical reading order
3. Check:
✓ Item count announced ("Item 1 of 10")
✓ Headings mark sections
✓ Load more/pagination clearGood pagination labels:
cell.accessibilityLabel = "Message from John, Item 5 of 42"
loadMoreButton.accessibilityLabel = "Load 20 more messages"Basic audit in test pipeline:
1. Launch app to key screen
2. accessibility-quality-check → Get score
3. Assert score >= "good"
4. describe → Capture accessibility tree
5. Validate:
- All buttons have labels
- No images without labels (excluding decorative)
- No duplicate labels in same context
- Logical element orderFail build if:
Track accessibility over time:
1. Capture baseline accessibility tree (JSON)
2. On each commit:
- Capture current tree
- Compare to baseline
- Flag new missing labels
- Flag changed reading order
3. Review and approve changes or fix regressionsSymptoms:
describe doesn't show itSolutions:
isAccessibilityElement = trueisHidden = falseaccessibilityElementsHidden = false on parentsSymptoms:
Solutions:
accessibilityElements array to set explicit order:containerView.accessibilityElements = [label, field, button]Symptoms:
Solutions:
containerView.isAccessibilityElement = true
containerView.accessibilityLabel = "Email from John Doe, unread"Design with accessibility from the start:
iOS equivalent:
Automated testing catches technical issues, but:
// Intentionally not accessible - purely decorative
backgroundImage.isAccessibilityElement = false
// Combined for better experience - announces as single element
cardView.isAccessibilityElement = true
cardView.accessibilityLabel = "\(title), \(date), \(author)"
titleLabel.isAccessibilityElement = false
dateLabel.isAccessibilityElement = false
authorLabel.isAccessibilityElement = falseSet standards and enforce:
Measure in CI/CD:
Run: accessibility-quality-check
Assert: score >= "good"
Run: describe → Parse accessibility tree
Assert: All buttons have labels
Assert: No generic labels ("button", "image")This Skill works with these MCP tools:
Workflow integration:
1. accessibility-quality-check → Assess app quality
2. idb-ui-describe → Get detailed tree
3. Analyze semantic structure
4. screenshot → Verify contrast/visual (if needed)xc://reference/accessibility: Accessibility API referencexc://reference/wcag: WCAG 2.1 guidelines mapped to iOSxc://workflows/accessibility-first: This workflow patternxc://examples/voiceover-testing: VoiceOver test examplesRemember: Accessibility tree is ground truth. Build accessible from the start. Test with real users.
© conorluddy, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/accessibility-testing of conorluddy/xclaude-plugin.
Open the folder on GitHubat commit 6de4b2c
iOS Accessibility Testing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| iOS Accessibility Testing this skillconorluddy/xclaude-plugin | 183 | — | ~5k | Automated safety check: Pass | MIT | |
| iOS Simulator Skillconorluddy/ios-simulator-skill | 1.3k | — | ~5.7k | Automated safety check: Pass | MIT | |
| Orca iOS Simulator Controlstablyai/orca | 87k | 1 repos | ~584 | Automated safety check: Pass | Apache-2.0 | |
| Limrun iOS Simulatorsuperset-sh/superset | 15k | — | ~5.2k | Automated safety check: Notes | Custom licence | |
| Xcode Simulator TestEveryInc/compound-engineering-plugin | 25k | — | ~519 | Automated safety check: Pass | MIT | |
| Apple Crash Log .NET Symbolicationdotnet/skills | 5.6k | 1 repos | ~2.4k | Automated safety check: Pass | MIT |
conorluddy/ios-simulator-skill
29 production-ready scripts for iOS app testing, building, and automation.
stablyai/orca
iOS Simulator control from inside Orca, with the live device view in Orca's emulator pane. Use when driving a booted Apple Simulator on macOS: taps, gestures…
superset-sh/superset
Drives an app on a Limrun cloud iOS simulator from any OS: launch, tap, type, read the accessibility tree and logs, take screenshots, record video and reach local services.
EveryInc/compound-engineering-plugin
Builds an iOS app, exercises it on a simulator with XcodeBuildMCP and reports PASS, FAIL or PARTIAL with screenshots, logs and per-screen evidence.
dotnet/skills
Resolves .NET runtime frames in Apple .ips crash logs to function names, source files and line numbers using dSYM symbols, atos and the Microsoft symbol server.
AvdLee/SwiftUI-Agent-Skill
Scan Apple's SwiftUI documentation for deprecated APIs and update the SwiftUI Expert Skill with modern replacements.
conorluddy/xclaude-plugin
Walks through retrieving, symbolicating and diagnosing iOS crash logs, turning a cryptic stack trace into the function names that actually failed.
conorluddy/xclaude-plugin
Manages iOS Simulator devices and apps through the execute_simulator_command MCP tool instead of raw simctl: boot, create and delete devices, install and launch apps, screenshots and diagnostics.
conorluddy/xclaude-plugin
Teaches how xc-plugin saves tokens with progressive disclosure, cached responses and consistent configuration, so large device lists and build logs arrive as summaries first.
conorluddy/xclaude-plugin
Accessibility-first UI automation using IDB. An agent skill from conorluddy/xclaude-plugin.
conorluddy/xclaude-plugin
Directs iOS build, test and clean operations through the execute_xcode_command MCP tool instead of raw xcodebuild in the shell, with parameter-level retries on failure.
conorluddy/xclaude-plugin
Instruments integration and performance analysis workflows for iOS apps.
Works with
Categories
Guides WCAG 2.1 and VoiceOver accessibility testing for iOS apps, working from the accessibility tree and not from screenshots. The central principle is that the accessibility tree is the primary testing interface. It shows what screen readers see: structure and relationships, focus order, element roles and states, and text alternatives.
iOS Accessibility Testing fits situations like: validating an iOS app's accessibility before a release; debugging a VoiceOver problem that users reported; checking contrast ratios and Dynamic Type support on new screens; adding an accessibility audit step to a CI pipeline.
Run `npx skills add conorluddy/xclaude-plugin --skill accessibility-testing -a claude-code`. Or copy the skill folder (skills/accessibility-testing in conorluddy/xclaude-plugin) into .claude/skills/accessibility-testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add conorluddy/xclaude-plugin --skill accessibility-testing -a codex`. Or copy the skill folder (skills/accessibility-testing in conorluddy/xclaude-plugin) into .agents/skills/accessibility-testing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add conorluddy/xclaude-plugin --skill accessibility-testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/accessibility-testing, .gemini/skills/accessibility-testing, .github/skills/accessibility-testing and .opencode/skills/accessibility-testing in your project.
SKILL.md names no scripts, command-line tools or credentials: iOS Accessibility Testing is instructions for the agent only. Our summary lists: The xclaude plugin's idb-based accessibility tools; An iOS app to inspect.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
iOS Accessibility Testing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with iOS Accessibility Testing: iOS Simulator Skill (conorluddy/ios-simulator-skill, 1.3k stars), Orca iOS Simulator Control (stablyai/orca, 87k stars), Limrun iOS Simulator (superset-sh/superset, 15k stars) and Xcode Simulator Test (EveryInc/compound-engineering-plugin, 25k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
conorluddy (a GitHub user) maintains it in conorluddy/xclaude-plugin, which has 183 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on September 12, 2026.
Source: conorluddy/xclaude-plugin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.