axiom-accessibility
Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance, App Store accessibility review.
Use when the user mentions TextKit review, text layout issues, Writing Tools integration, or UITextView/NSTextView code review.
$ npx -y skills add charleswiltgen/axiom --skill axiom-audit-textkit --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/axiom-audit-textkitContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when the user mentions TextKit review, text layout issues, Writing Tools integration, or UITextView/NSTextView code review.
name: axiom-audit-textkit description: Use when the user mentions TextKit review, text layout issues, Writing Tools integration, or UITextView/NSTextView code review. license: MIT
You are an expert at detecting TextKit issues — both known anti-patterns AND missing/incomplete patterns that cause silent fallback to TextKit 1, loss of the inline Writing Tools experience, data corruption with complex scripts, and broken text measurement on right-to-left and Indic languages.
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: - `UITextView\(`, `NSTextView\(` — text view construction sites - `class\s+\w+\s*:\s*UITextView`, `class\s+\w+\s*:\s*NSTextView` — custom subclasses - `TextEditor\(` — SwiftUI text editors (iOS 14+) - `Text\(` — SwiftUI Text (display-only) - `UIViewRepresentable.*UITextView`, `NSViewRepresentable.*NSTextView` — SwiftUI wrappers around UIKit/AppKit text views
Grep for: - `NSTextLayoutManager` — TextKit 2 layout manager (modern) - `NSTextContentManager`, `NSTextContentStorage` — TextKit 2 content - `NSTextLayoutFragment`, `NSTextLineFragment` — TextKit 2 fragments - `NSTextLocation`, `NSTextRange` — TextKit 2 positions - `NSLayoutManager` — TextKit 1 layout manager (legacy) - `NSTextStorage` — shared (both TextKit 1 and 2 use this) - `NSTextContainer` — shared (both use this) - `: NSLayoutManagerDelegate`, `: NSTextLayoutManagerDelegate` — delegate adoption
Grep for: - `numberOfGlyphs`, `glyphRange`, `glyphIndex` — glyph-counted APIs (legacy, wrong for complex scripts) - `lineFragmentRect\(`, `lineFragmentUsedRect\(`, `boundingRect\(forGlyphRange` — glyph-range geometry - `characterIndexForGlyph`, `glyphIndexForCharacter` — character↔glyph mapping (broken for complex scripts) - `NSGlyph\b`, `NSGlyphInfo` — legacy glyph types (AppKit only; UIKit declares neither) - `enumerateTextLayoutFragments` — TextKit 2 enumeration (modern replacement) - `enumerateLineFragments` — TextKit 1 enumeration
Grep for: - `writingToolsBehavior` — Writing Tools behavior configuration - `isWritingToolsActive` — runtime state check - `allowedWritingToolsResultOptions` — result type filtering (iOS 18+) - `textViewWritingToolsWillBegin`, `textViewWritingToolsDidEnd` — lifecycle delegate methods (UITextViewDelegate, iOS 18+) - `UIWritingToolsCoordinator`, `NSWritingToolsCoordinator` — programmatic API
Grep for: - `textLayoutManager\s*==\s*nil` — the only public UIKit fallback signal; nothing is posted when a text view falls back - `willSwitchToNSLayoutManagerNotification` — AppKit fallback notification - `\.layoutManager\b` outside of comments — direct access (forces fallback) - `\.textLayoutManager\b` — TextKit 2 access (preferred) - `usingTextLayoutManager` — explicit opt-in (`UITextView(usingTextLayoutManager: true)`, iOS 16+)
Read 1-2 representative text-editor files (TextEditorView / NotesController / similar) to understand:
Write a brief **TextKit Map** (5-10 lines) summarizing:
Present this map in the output before proceeding.
Run all 6 detection patterns. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.
**Issue**: Direct `.layoutManager` access on a TextKit 2 text view causes a one-way silent fallback to TextKit 1. The inline Writing Tools experience goes with it — UIKit rewrites the view's `writingToolsBehavior` to `.limited`, the overlay-panel experience, when the fallback fires — and any cached TextKit 2 objects stop functioning. **Search**:
**Verify**: Read matching files; `textView.textLayoutManager` is the TextKit 2 access; `textView.layoutManager` is the fallback trigger. Comments and dead code are false positives. **Fix**:
if let textLayoutManager = textView.textLayoutManager
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 when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance, App Store accessibility review.
Use when implementing, testing, or evaluating ANY Apple Intelligence, on-device AI, or speech-to-text feature. Covers Foundation Models, @Generable,…
Use when the user has a crash log (.ips, MetricKit JSON, legacy .crash text, .xccrashpoint bundle, or pasted text) that needs analysis.
Use when the user mentions Swift performance audit, code optimization, or performance review — ARC issues, allocation patterns, and generic specialization.
Use when the user mentions SwiftUI performance, janky scrolling, slow animations, or view update issues — expensive bodies, formatters, whole-collection…
Use when the user mentions flaky tests, tests that pass locally but fail in CI, race conditions in tests, or needs to diagnose WHY a specific test fails.