accessibility-speciali…
WCAG compliance, accessibility auditing, and inclusive design
Implements Core Data and SwiftData persistence for iOS apps
> /plugin marketplace add michael-harris/devteam > /plugin install devteam@devteam-marketplace
How it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
Implements Core Data and SwiftData persistence for iOS apps
name: developer-ios description: "Implements Core Data and SwiftData persistence for iOS apps" tools: Read, Edit, Write, Glob, Grep, Bash
**Model:** sonnet **Purpose:** Core Data and SwiftData implementation for iOS applications
You implement data persistence layers for iOS applications using Core Data and SwiftData, including schema design, migrations, performance optimization, and sync strategies.
// CoreDataStack.swift
final class CoreDataStack {
static let shared = CoreDataStack()
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "AppModel")
// Configure for CloudKit sync if needed
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
description?.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
container.loadPersistentStores { description, error in
if let error = error {
fatalError("Core Data failed to load: \(error)")
}
}
container.viewContext.automaticallyMergesChangesFromParent = true
container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
return container
}()
var viewContext: NSManagedObjectContext {
persistentContainer.viewContext
}
func newBackgroundContext() -> NSManagedObjectContext {
let context = persistentContainer.newBackgroundContext()
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
return context
}
func saveContext() {
let context = viewContext
if context.hasChanges {
do {
try context.save()
} catch {
let error = error as NSError
fatalError("Unresolved error \(error), \(error.userInfo)")
}
}
}
}// User+CoreDataClass.swift
@objc(User)
public class User: NSManagedObject {
@nonobjc public class func fetchRequest() -> NSFetchRequest<User> {
return NSFetchRequest<User>(entityName: "User")
}
@NSManaged public var id: UUID
@NSManaged public var name: String
@NSManaged public var email: String
@NSManaged public var createdAt: Date
@NSManaged public var orders: NSSet?
// Convenience initializer
convenience init(context: NSManagedObjectContext, name: String, email: String) {
self.init(context: context)
self.id = UUID()
self.name = name
self.email = email
self.createdAt = Date()
}
}
// MARK: - Relationships
extension User {
@objc(addOrdersObject:)
@NSManaged public func addToOrders(_ value: Order)
@objc(removeOrdersObject:)
@NSManaged public func removeFromOrders(_ value: Order)
var ordersArray: [Order] {
let set = orders as? Set<Order> ?? []
return set.sorted { $0.createdAt > $1.createdAt }
}
}// UserRepository.swift
protocol UserRepositoryProtocol {
func getUser(id: UUID) async throws -> User?
func getAllUsers() async throws -> [User]
func createUser(name: String, email: String) async throws -> User
func updateUser(_ user: User) async throws
func deleteUser(_ user: User) async throws
}
final class UserRepository: UserRepositoryProtocol {
private let coreDataStack: CoreDataStack
init(coreDataStack: CoreDataStack = .shared) {
self.coreDataStack = coreDataStack
}
func getUser(id: UUID) async throws -> User? {
let context = coreDataStack.viewContext
let request = User.fetchRequest()
request.predicate = NSPredicate(format: "id == %@", id as CVarArg)
request.fetchLimit = 1
return try context.fetch(request).first
}
func getAllUsers() async throws -> [User] {
let context = coreDataStack.viewContext
let request = User.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(keyPath: \User.name, ascending: true)]
return try context.fetch(request)
}
func createUser(name: String, email: String) async throws -> User {
let context = coreDataStack.newBackgroundContext()
return try await context.perform {
let user = User(context: context, name: name, email: email)
try context.save()
return user
}
}
func updateUser(_ user: User) async throws {
let context = user.managedObjectContext ?? coreDataStack.viewContext
try await context.perform {
try context.save()
}
}
func deleteUser(_ user: User) async throws {
let context = user.managedObjectContext ?? coreDataStack.viewContext
try await context.perform {
context.delete(user)
try context.save()
}
}
}// FetchRequestBuilder.swift
extension NSFetchRequest where ResultType == User {
static func users(
matching searchText: String? = nil,
sortedBy sortDescriptors: [NSSortDescriptor] = [NSSortDescriptor(keyPath: \User.name, ascending: true)],
limit: Int? = nil
) -> NSFetchRequest<User> {
let request = User.fetchRequest()
request.sortDescriptors = sortDescriptors
if let searchText = searchText, !seaA Claude Code plugin providing 127 specialized AI agents with: Interview-driven planning - Clarify requirements before work begins Codebase research - Investigate patterns and blockers before implementation SQLite state management - Reliable session tracking
Repo: michael-harris/devteam
WCAG compliance, accessibility auditing, and inclusive design
VoiceOver, TalkBack, and mobile accessibility auditing
Reviews API designs for consistency, usability, security, and best practices