Accessorysetupkit

iOS AccessorySetupKit picker, discovery descriptors, and CoreBluetooth/Wi-Fi handoff

Tested · Works

Test report

Verdict
Tested · Works
Score
8.8/10
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

  • /accessorysetupkit iOS 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.