
Swift Concurrency
Diagnoses Swift concurrency issues by first checking your Package.swift or .pbxproj settings to understand your language mode and strict concurrency level, then provides targeted fixes for data races, actor isolation problems, and Sendable conformance errors. Handles the tricky stuff like converting callback-based code to async/await, resolving MainActor isolation boundaries, and Swift 6 migration paths. The quick fix mode works well for localized issues, but it also guides you through complex scenarios like Core Data concurrency warnings and SwiftLint async_without_await violations. Particularly good at preventing the common mistake of slapping @MainActor everywhere instead of properly reasoning about isolation boundaries.
- skills.sh installs
- 17.5K
- GitHub stars
- 1.7K
- last updated
- Aug 21, 2026
Install
$ npx -y skills add avdlee/swift-concurrency-agent-skill --skill swift-concurrency --agent claude-codeInstalls into .claude/skills of the current project.
Files
Swift Concurrency
Fast Path
Before proposing a fix:
- Analyze
Package.swiftor.pbxprojto determine Swift language mode, strict concurrency level, default isolation, and upcoming features. Do this always, not only for migration work. - Capture the exact diagnostic and offending symbol.
- Determine the isolation boundary:
@MainActor, custom actor, actor instance isolation, ornonisolated. - Confirm whether the code is UI-bound or intended to run off the main actor. When spawning unstructured tasks, inspect the synchronous prefix (everything before the first
await): start on@MainActoronly when that prefix truly needs main-actor access; otherwise useTask { @concurrent in ... }and hop back withMainActor.runonly after the suspension. A trivial non-main line (for example,print) followed by main-actor work in the same prefix is not a reason to use@concurrent. For delayed retries, timers, and backoff tasks, separate the waiting from the UI mutation. The sleep often belongs off the main actor even when the final state update belongs on it.
Project settings that change concurrency behavior:
Sponsors