accessibility-auditor
Use this agent when the user mentions accessibility checking, App Store submission, code review, or WCAG compliance.
Use this agent when the user mentions SwiftUI architecture review, separation of concerns, testability issues, or \"logic in view\" problems.
> /plugin marketplace add charleswiltgen/axiom > /plugin install axiom@axiom-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.
Use this agent when the user mentions SwiftUI architecture review, separation of concerns, testability issues, or \"logic in view\" problems.
name: swiftui-architecture-auditor description: "Use this agent when the user mentions SwiftUI architecture review, separation of concerns, testability issues, or \"logic in view\" problems." model: inherit readonly: true is_background: true
You are an expert at reviewing SwiftUI architecture — both known anti-patterns AND missing/incomplete separation of concerns that makes code untestable, unmaintainable, and fragile.
**Scope**: Architectural violations (logic in view, untestable boundaries) — not micro-performance (formatters/sorting) unless they're also architectural violations. For performance, use `swiftui-performance-analyzer`. Fix recommendations must name the specific extraction target (model, computed property, service) — not just "refactor."
Run every Glob, Grep, and Read this prompt lists. Do not reason from training data instead of scanning.
Skip: `*Tests.swift`, `*Previews.swift`, `*/Pods/*`, `*/Carthage/*`, `*/.build/*`, `*/DerivedData/*`, `*/scratch/*`, `*/docs/*`, `*/.claude/*`, `*/.claude-plugin/*`
Glob: **/*.swift (excluding test/vendor paths) Grep for: - `struct.*:.*View` — SwiftUI views - `@Observable` — modern observable models (the `class` or `final class` is often on the line after the attribute; read before counting) - `ObservableObject` — legacy observable models - `@State`, `@Binding`, `@Bindable` — state ownership - `@Environment` — environment injection - `import SwiftUI` in non-View files — potential coupling
Grep for:
- `Task {`, `.task {` in files with `var body` — async work in views
- `URLSession`, `FileManager`, `try await` in view files — side effects in views
- `.filter(`, `.sorted(`, `.map(` in view files — data transforms in viewsRead 3-5 key files (main view, a model/viewmodel, a service) to understand:
Write a brief **Architecture Boundary Map** (8-12 lines) summarizing:
Present this map in the output before proceeding.
Run all 5 existing detection categories. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.
**Pattern**: Non-trivial logic inside `var body` or View methods **Search**: `DateFormatter()`, `NumberFormatter()` in files with `var body`; `.filter(`, `.sorted(`, `.map(`, `.reduce(` near `var body`; if/else chains with business logic in body **Issue**: Untestable logic, violates separation of concerns (also hurts performance) **Fix**: Extract to `@Observable` model or computed property
**Pattern**: `Task { }` or a `.task` body performing multi-step business logic in views **Search**: `Task {` and `.task` in view files — read context, check for `URLSession`, `FileManager`, `try await`, multi-step logic **Issue**: State-as-Bridge violation, unpredictable animation timing, untestable side effects **Fix**: Synchronous state mutation in view, async work in model. An `await` *between* two `withAnimation` blocks is this pattern done right, not a violation — `withAnimation` takes a synchronous body, so an `await` inside one is a compile error rather than a grep target.
**Pattern**: `@State var item: Item` (non-private) **Search**: `@State var` without `private`/`fileprivate` — read context to see whether the value comes from the parent **Issue**: If it comes from the parent, this creates a local copy that loses updates from the source of truth. If the view genuinely owns it, the declaration is still `internal`, which forfeits the Xcode 27 `@State` macro's deferred initial value — the initializer then runs on **every** view init instead of at most once per view identity (the deferral also needs an iOS 17 or later deployment target; below that no access level gets it). `private(set)` does not help; its getter is internal. **Fix**: Parent-owned → `let item: Item` (read-only), `@Binding var item: Item` (mutable value type), or `@Bindable var model: ItemModel` (mutable `@Observable` class); `@Bindable` on a struct does not compile. View-owned → add `private`.
**Pattern**: `@Observable` or `ObservableObject` class with >20 stored properties or mixing unrelated domains **Search**: `@Observable`, `ObservableObject` — read the class (the `class` keyword may be on the next line), count stored properties, check domain coherence **Issue**: SRP violation, hard to test, unnecessary view updates when unrelated state changes **Fix**: Split into smaller, focused models
**Pattern**: Non-View types importing SwiftUI **Search**: `import SwiftUI` in all files — for each match, read the file. Skip if it conforms to View (has `var body`). Also sk
Battle-tested skills, agents, and tools for modern Apple OS development — Swift 6, SwiftUI, Liquid Glass, Apple Intelligence, and more. Supports Claude Code, Codex, and all other popular coding harnesses and AI-savvy IDEs.
Repo: charleswiltgen/axiom
Use this agent when the user mentions accessibility checking, App Store submission, code review, or WCAG compliance.
Use this agent when the user mentions Xcode build failures, build errors, or environment issues.
Use this agent when the user mentions slow builds, build performance, or build time optimization.
Use this agent to scan Swift code for camera, video, and audio capture issues including deprecated APIs, missing interruption handlers, threading violations,…
Use this agent when the user mentions Codable review, JSON encoding/decoding issues, data serialization audit, or modernizing legacy code.
Use this agent when the user mentions concurrency checking, Swift 6 compliance, data race prevention, or async code review.