Accessorysetupkit
iOS AccessorySetupKit picker, discovery descriptors, and CoreBluetooth/Wi-Fi handoff
Test report
- Verdict
- Tested · Works
- Score
- Tested
- Jul 21, 2026
- Environment
- Claude Code 2.x (agent harness)
- Upstream re-checked
- Aug 10, 2026 · 9493e49
Installed into a throwaway HOME (export HOME=$(mktemp -d)) via git clone + cp; frontmatter parsed clean with only name+description, and all three spot-checked paths returned HTTP 200 (references/accessorysetupkit-patterns.md 18712 B, evals/evals.json 4308 B, README.md 26060 B). A grep for curl|sh, base64 blobs, credential/token strings, absolute /Users paths and injection phrasing across SKILL.md and the patterns file returned zero hits. Trigger phrasings judged: SHOULD fire - "Add a system accessory picker so users can pair our BLE thermostat without a Bluetooth permission prompt" (yes), "Which ASDiscoveryDescriptor fields match a Wi-Fi accessory by SSID prefix?" (yes), "We scan with CBCentralManager today; migrate our paired devices to the iOS 18 accessory setup flow" (yes); SHOULD NOT fire - "Write a CoreBluetooth GATT client that subscribes to heart-rate notifications on an already-paired peripheral" (correctly skipped, post-pairing GATT is out of scope) and "Set up NEHotspotConfiguration to join a Wi-Fi network the user typed in manually" (correctly skipped, no accessory). Output test: wrote baseline.swift.md then skill.swift.md for the same task. The baseline set descriptor.bluetoothNameSubstring = "ThermoX" but declared only NSAccessorySetupBluetoothServices in Info.plist - the documented crash-during-discovery case; it also added an unnecessary NSBluetoothAlwaysUsageDescription, built CBCentralManager in init() and called retrievePeripherals without waiting for .poweredOn, captured self strongly in session.activate, force-unwrapped UIImage(named:)!, and handled only .accessoryAdded/.accessoryRemoved behind a default: (so .activated never reconnects previously paired accessories, and no @unknown default). The skill version added NSAccessorySetupBluetoothNames, dropped the usage-description key, used [weak self], deferred the connect from .accessoryAdded to .pickerDidDismiss via a pendingAccessory field, gated retrievePeripherals on .poweredOn with a retry in centralManagerDidUpdateState, and covered .activated/.invalidated/@unknown default. Docs docked one point: I could not verify the iOS 26.1-only APIs it cites (ASDiscoveredDisplayItem, updatePicker, finishPickerDiscovery) against live Apple docs, and no Swift here was compiled.
Scored on four weighted criteria — install, triggering, output vs. baseline, docs. How scoring works
- Installs cleanly 5/5
- Triggers reliably 5/5
- Output vs. baseline 8/10
- Docs & honesty 4/5
What Accessorysetupkit does
Reference skill for Apple's AccessorySetupKit (iOS 18+): required Info.plist keys, ASDiscoveryDescriptor matching rules for BLE and Wi-Fi accessories, ASAccessorySession event ordering, and the handoff to CoreBluetooth or NEHotspotConfiguration after pairing. Triggers when building an accessory pairing flow, writing discovery descriptors, handling accessory session events, or migrating existing CoreBluetooth-authorized devices to the system picker. Ships a 636-line patterns file covering custom filtering, removal handling, error recovery, and a SwiftUI manager pattern.
How to install Accessorysetupkit
git clone --depth 1 https://github.com/dpearson2699/swift-ios-skills.git /tmp/accessorysetupkit-src
mkdir -p ~/.claude/skills
cp -R /tmp/accessorysetupkit-src/skills/accessorysetupkit ~/.claude/skills/accessorysetupkit
# No deps, no API keys, no scripts: SKILL.md (14 KB) + references/accessorysetupkit-patterns.md (19 KB) + evals/evals.json
# Alternative (whole 86-skill repo, interactive picker): npx skills add dpearson2699/swift-ios-skills
# Alternative (Claude Code plugin marketplace): /plugin marketplace add dpearson2699/swift-ios-skills
# Usage: model-invoked. Just describe the accessory pairing task inside an iOS project.
# License is PolyForm Perimeter 1.0.0 (not OSI open source) - read LICENSE before redistributing
Skills live in ~/.claude/skills/ (global) or .claude/skills/
(per-project). Restart Claude Code after installing.
Commands — how to trigger Accessorysetupkit
-
/accessorysetupkitiOS AccessorySetupKit picker, discovery descriptors, and CoreBluetooth/Wi-Fi handoff
It also activates on plain-language prompts like these:
-
Add a BLE accessory picker using AccessorySetupKit -
Migrate from CoreBluetooth scanning to AccessorySetupKit -
Define a discovery descriptor for my Wi-Fi device
Frequently asked questions
- Is the Accessorysetupkit skill free?
- Yes. The skill itself is free from dpearson2699/swift-ios-skills. SkillProof publishes the install command and an independent test verdict at no cost.
- Does Accessorysetupkit work with Claude Code?
- We tested it with Claude Code 2.x (agent harness) on Jul 21, 2026. Verdict: Tested · Works. Installed into a throwaway HOME (export HOME=$(mktemp -d)) via git clone + cp; frontmatter parsed clean with only name+description, and all three spot-checked paths returned HTTP 200 (references/accessorysetupkit-patterns.md 18712 B, evals/evals.json 4308 B, README.md 26060 B). A grep for curl|sh, base64 blobs, credential/token strings, absolute /Users paths and injection phrasing across SKILL.md and the patterns file returned zero hits. Trigger phrasings judged: SHOULD fire - "Add a system accessory picker so users can pair our BLE thermostat without a Bluetooth permission prompt" (yes), "Which ASDiscoveryDescriptor fields match a Wi-Fi accessory by SSID prefix?" (yes), "We scan with CBCentralManager today; migrate our paired devices to the iOS 18 accessory setup flow" (yes); SHOULD NOT fire - "Write a CoreBluetooth GATT client that subscribes to heart-rate notifications on an already-paired peripheral" (correctly skipped, post-pairing GATT is out of scope) and "Set up NEHotspotConfiguration to join a Wi-Fi network the user typed in manually" (correctly skipped, no accessory). Output test: wrote baseline.swift.md then skill.swift.md for the same task. The baseline set descriptor.bluetoothNameSubstring = "ThermoX" but declared only NSAccessorySetupBluetoothServices in Info.plist - the documented crash-during-discovery case; it also added an unnecessary NSBluetoothAlwaysUsageDescription, built CBCentralManager in init() and called retrievePeripherals without waiting for .poweredOn, captured self strongly in session.activate, force-unwrapped UIImage(named:)!, and handled only .accessoryAdded/.accessoryRemoved behind a default: (so .activated never reconnects previously paired accessories, and no @unknown default). The skill version added NSAccessorySetupBluetoothNames, dropped the usage-description key, used [weak self], deferred the connect from .accessoryAdded to .pickerDidDismiss via a pendingAccessory field, gated retrievePeripherals on .poweredOn with a retry in centralManagerDidUpdateState, and covered .activated/.invalidated/@unknown default. Docs docked one point: I could not verify the iOS 26.1-only APIs it cites (ASDiscoveredDisplayItem, updatePicker, finishPickerDiscovery) against live Apple docs, and no Swift here was compiled.
- What is the Accessorysetupkit SkillProof Score?
- 8.8/10 — installs cleanly 5/5, triggers reliably 5/5, output vs. baseline 8/10, docs & honesty 4/5.
- How do I install Accessorysetupkit?
- Copy the install command from this page, run it in your terminal, and restart Claude Code. Skills live in ~/.claude/skills/ (global) or .claude/skills/ inside a project.
- Can I use Accessorysetupkit with Cursor, Copilot, Gemini CLI, Codex or other AI tools?
- The SKILL.md format is native to Claude (Claude Code, Desktop, claude.ai). The instructions inside adapt to other assistants: Cursor rules, GitHub Copilot instructions, Windsurf rules, Custom GPTs, AGENTS.md for OpenAI Codex, and GEMINI.md for Google Gemini CLI — our conversion guides cover each, and the free converter on the tools page does the wrapping for you.