From beagle-ios
Reviews iOS animation code in Swift files for correctness, performance, accessibility, and Apple API best practices including withAnimation, PhaseAnimator, matchedGeometryEffect.
npx claudepluginhub existential-birds/beagle --plugin beagle-iosThis skill uses the workspace's default tool permissions.
| Issue Type | Reference |
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
| Issue Type | Reference |
|---|---|
| Spring parameters, withAnimation misuse, phase/keyframe bugs | references/swiftui-animation-patterns.md |
| Frame drops, offscreen rendering, main thread blocking | references/performance.md |
| Reduce Motion, VoiceOver, motion sensitivity | references/accessibility.md |
| Transition protocol, matchedGeometryEffect, navigation transitions | references/transitions.md |
Report each finding as:
[FILE:LINE] ISSUE_TITLE
Example: [AnimatedCard.swift:42] Missing Reduce Motion fallback for spring animation
All details, code suggestions, and rationale follow after the header line.
@Environment(\.accessibilityReduceMotion) checked — animations have Reduce Motion fallback.sensoryFeedback) or audioduration/bounce parameters (not raw mass/stiffness/damping unless UIKit/CA).animation() without value: parameterwithAnimation wraps state changes, not view declarationsmatchedGeometryEffect IDs are stable and unique within the namespacegeometryGroup() used when parent geometry animates with child views appearingPhaseAnimator, symbolEffect) have finite phases or appropriate triggerCATransaction.setAnimationDuration() in UIView-backed layers (use UIView.animate instead)shadowPath (avoids per-frame recalculation).id() modifier (destroys view identity — use transition or matchedGeometryEffect instead)withAnimation scope issues → swiftui-animation-patterns.mdmatchedGeometryEffect glitches or custom Transition bugs → transitions.mdwithAnimation scoped to the minimal state change needed, or is it wrapping unrelated mutations?matchedGeometryEffect — are source and destination using the same ID and namespace, and is only one visible at a time?