Adds the Codex plugin manifest with listing metadata, PNG icons for the
portal (raw GitHub URLs cannot serve SVGs or symlinks), bumps the release
workflow to version all manifests including .codex-plugin, and
restructures the README around the primary install paths with the
remaining clients moved to INSTALLATION.md.
Add a root plugin.json manifest and move the skill to the canonical
skills/swiftui-expert-skill/ location per the Agent Plugins
specification (https://agent-plugins.org). A symlink at the old root
path keeps existing clones and scripts working until the next major
version.
Aligns all wrapper versions at 4.1.0 (agents/openai.yaml had drifted to
2.2.0), adds ChatGPT desktop interface metadata to the skill, and
updates the release workflow to bump every manifest.
Use the proper iOS 17 and iOS 18 scroll position overloads, clarify geometry update behavior, and consolidate duplicate examples so agents receive one accurate pattern.
A binding stored in an undecorated property (let/var x: Binding<T>) is
invisible to SwiftUI's dependency tracking, because only DynamicProperty
properties are unwrapped and subscribed to. The view then fails to
re-evaluate when the bound value changes from elsewhere. Debug builds can
mask this with extra graph passes, so it often surfaces only in Release.
Adds a subsection under @Binding and a matching Key Principles entry.
Add onScrollGeometryChange and scrollPosition() coverage, restructure
Scroll Position Tracking to present the modern API first, and demote
the GeometryReader + PreferenceKey approach to a legacy fallback note.
Closes#68
Updates GitHub Actions that still run on the deprecated Node.js 20
runtime, which is being phased out on GitHub-hosted runners.
- actions/checkout v4 -> v6
- actions/setup-node v4 -> v6 (and script Node 20 -> 24)
- softprops/action-gh-release v2 -> v3
Fold the strongest guidance from Apple's bundled swiftui-specialist skill into
the SwiftUI Expert Skill, deduplicating overlaps and fixing stale advice.
Fixes / corrections:
- list-patterns: `.enumerated()` no longer needs Array() on Swift 6.1+, and the
id must be the element's identity, not `\.offset` (same trap as `.indices`)
- list-patterns: make the unified-row example unary (wrap branching in a
container) so List can template row ids
- view-structure: soften the property-ordering mandate to an optional
readability suggestion (per AGENTS.md, no formatting rules)
Sharpened:
- view-structure: invalidation-boundary framing for extracting subviews, plus
the multi-section detail-view anti-pattern and a "don't auto-refactor .if"
review note
- performance-patterns: full rapidly-updating-environment pattern (coarsened
@Observable thresholds, per-item models, scrollTransition/visualEffect)
- animation-advanced: when to implement animatableData manually, AnimatableValues
(iOS 26+) vs AnimatablePair
Added:
- state-management: make @Observable property types Equatable (setter
short-circuit), per-property observation granularity traps + fixes, KeyPath
bindings over closure bindings, no closures in custom environment keys,
stable @Entry defaults, removing unused @Environment reads
- view-structure: keep view init cheap; single-child Group anti-pattern
- list-patterns: unary vs multi rows, -LogForEachSlowPath, stable/cheap ids
- new references/localization.md and references/soft-deprecation.md
- SKILL.md Topic Router, References list, Correctness Checklist, and trigger
description updated for the new coverage
The `.cursor-plugin/plugin.json` is now in place, so Option C no longer
needs the "coming soon" disclaimer. Point readers at the Cursor plugins
docs for installation instructions.
Co-authored-by: jack-old-archive <aven@users.noreply.github.com>
Per AGENTS.md, testing frameworks and patterns are excluded from this
skill. Drop the XCTest, XCUITest, snapshot testing, and @Observable
model testing sections, and rename the reference to previews.md so the
file name matches its remaining scope.
Also addresses the Copilot review:
- Remove the UIKit/AppKit preview section (off-mission per the
SwiftUI-first operating rule).
- Replace the invented URLSession.decode(_:from:) call with a real
URLSession.data(from:) + JSONDecoder pair.
- Switch the @Previewable @FocusState example from .onAppear writes to
.defaultFocus, matching focus-patterns.md.
- Soften the "use #Preview for all new previews" checklist item to a
preference, since PreviewProvider is not deprecated.
- Cross-link state-management.md and focus-patterns.md from the
preview docs.
- Restore the blank line between the correctness checklist and the
References section in SKILL.md.
GlassEffectStyle does not exist; the actual type is Glass. Also renames
the parameter label from style to glass to match the SDK signature, and
adds the missing isEnabled: Bool = true parameter to the modifier
signature and the glassEffectWithFallback helper example.
Glass.prominent does not exist in the shipping iOS 26 or macOS 26 SDKs.
The real static values are .regular, .clear, and .identity. Replace all
.prominent references with .regular (with tint for emphasis where needed)
and document the full set of available Glass statics.
Fixes#64
The skill currently has no coverage for testing or previews. Add a new
reference covering #Preview macro usage and traits, @Previewable for
inline bindings, mock data patterns for previews, XCTest strategies
for @Observable models and UI tests, ViewInspector for view-layer
unit testing, and snapshot testing with swift-snapshot-testing.