ios-feature
Feature or feature-change playbook for iOS apps: intake, pattern discovery, plan, implement, tests, simulator check, review, commit.
SKILL.mdcodex/skills/ios-feature/SKILL.md
GitHubRead the project AGENTS.md and applicable global guidance first. Fall back to CLAUDE.md if AGENTS.md is absent. Follow the global rules for optional tools, specialist agents and Git actions.
Feature work: the user request
Repo facts (workspace, schemes, build/test commands, test framework, design-system package, bundle id, deployment target)
come from the project's AGENTS.md. Never guess them.
- Intake. If an Atlassian MCP tool is available, fetch the Jira ticket and quote its acceptance criteria. Otherwise
restate the goal in three bullets plus an out-of-scope list. Branch
feat/<ticket>-<slug>(or the project's documented branch convention) off the default branch. - Discover the pattern. Use an explorer subagent to find the closest existing screen or flow: its SwiftUI
VieworUIViewController, view model /@Observablemodel, service or repository, where dependencies are assembled (composition root,@Environment), and tests. Note whether it is SwiftUI or UIKit and which test framework it uses. For a modify task also map every caller of the code you will change. If it changes UI, capture the touched screens now, the same way as step 7, and label thembefore. - Consult references. Load the
ios-standardsskill for the house patterns (state ownership, one-shot events, design system). Askios-researcheronly where guidance may have moved (navigation APIs, Liquid Glass, privacy manifests, deployment target behaviour, App Store requirements). - Plan. Files to add or change, state model (one
enum Stateper screen:loading/loaded(...)/error(...)), where data code goes, DI wiring, test list, simulator checks. For UI changes, consult$design-standards(tiered design rules, screen states, accessibility). Follow the project's architecture rules. Proceed within the user-authorized scope. Ask only about unresolved scope or consequential choices. - Implement in small steps, running the project's build command after each. New UI is SwiftUI inside the project's
design-system package and tokens, following the design rules (IOS-1 colours, IOS-3 safe area, TYP-1 Dynamic Type, A11Y-4 targets), split into a stateless
XContent(state, actions)with#Previewand a statefulXScreenthat owns the@MainActormodel and wires presentation. Loading runs in.task, neverTask {}inonAppear. No force unwraps. Use@Observableunless the project's deployment target is below iOS 17 (itsAGENTS.mdsays). - Tests. View-model and service tests in the project's framework (Swift Testing or XCTest per
AGENTS.md, with Quick/Nimble only where the target already uses it). Run them withxcodebuild test … -only-testing:<Target>/<Suite>and quote the summary (xcrun xcresulttool get test-results summary --path <bundle>.xcresult). - Simulator verification.
$ios-run-appon the default simulator, navigate to the feature, screenshot. Repeat atcontent_size accessibility-extra-largeand in dark appearance for any new or changed screen, and on an iPad simulator ifTARGETED_DEVICE_FAMILYincludes 2. Then hand off to theios-verifieragent with the test command, the simulator, bundle id, the screens to check and the journey file(s) for the touched screen. It returns test totals, the JSON journey result, screenshot paths and findings. A failure is a finding, not something to fix inside this step. A new screen gets a new journey. - Review.
ios-revieweragainst the acceptance criteria, and delegate UI/view changes toui-reviewerwith the labelled step 7 screenshot paths. Confirm each Blocker and Major against the code first, and decline a refuted one with the counter-evidence. Fix the rest, then re-run the compile check and the affected tests. Send the same reviewer the finding IDs and their "Verified fixed when" criteria to re-review the fix delta. Stop after two re-review rounds and report anything still open. List declined Nits. - Commit, only if asked. Follow the shared Git conventions. Do not push unless asked.
- Report: files changed, commands run with results, screenshot paths, what is left for QA.