Complete feature
Skill markdavidgan/apple-dev-skills/platforms/cursor/skills/complete-feature
Complete a feature implementation with full validation across build, tests, lint, and Apple patterns before committing. Use when a feature feels "done", before opening a PR, or when you want to confirm nothing was missed. Trigger on "complete this feature", "is this done", "finish the feature", "ready to commit", or "final validation".From its SKILL.md
npx -y skills add markdavidgan/apple-dev-skills --skill complete-featureAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.7 KB, ~1.8k tokens by cl100k_base, as published. Nobody here has run it
Feature Completion Workflow
Run this skill when you believe a feature is complete. It runs comprehensive checks across six areas.
Usage
/complete-feature "focus-timer-widget"
/complete-feature "category-ai-classification"
Parallel Dispatch
Phases 1–4 run as three parallel subagents to maximize speed. Dispatch all three simultaneously, then aggregate results before continuing to Phase 5.
Coordinator (you)
├─► Agent A — Build + Test [Fast tier: claude-haiku-4-5 / gpt-4.1-mini / gemini-3.0-flash]
├─► Agent B — Code Quality [Standard tier: claude-sonnet-4-6 / gpt-4.1 / gemini-3.1-pro]
└─► Agent C — Accessibility Audit [Standard tier: claude-sonnet-4-6 / gpt-4.1 / gemini-3.1-pro]
│
▼ (all three complete)
Coordinator — Phase 5: Documentation + Phase 6: App Store Readiness
Checkpoint Compaction
Before aggregating subagent results, before Phase 5 documentation, and before any
manual or automatic context reset, write a durable checkpoint in the feature plan,
issue, or completion report. Include completed work, remaining steps, changed
files, decisions made, verification already run, failures, and the next exact
command. After compaction or a new session, re-read the checkpoint and git status before continuing.
Agent A — Build + Test (Fast tier)
Spawn as apple-dev-skills:build-agent (or apple-dev-skills:explore). Prompt:
Run build and test verification for the iOS feature being completed.
1. Debug build (simulator):
xcodebuild -scheme <scheme> -destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' build 2>&1 | grep -E "error:|BUILD SUCCEEDED|BUILD FAILED"
2. Archive build (CRITICAL — catches MainActor isolation errors debug misses):
xcodebuild -scheme <scheme> -configuration Release -destination 'generic/platform=iOS' archive 2>&1 | grep -E "error:|ARCHIVE SUCCEEDED|ARCHIVE FAILED"
3. Unit tests:
<project-test-command> 2>&1 | tail -10
Report:
- BUILD: PASS/FAIL + first 3 errors if failed
- ARCHIVE: PASS/FAIL + first 3 errors if failed
- TESTS: X passed, Y failed + failing test names
Agent B — Code Quality (Standard tier)
Spawn as apple-dev-skills:code-reviewer. Prompt:
Run code quality checks on the changed files for this iOS feature.
Changed files: <list from git diff --name-only HEAD>
1. Apple patterns check — apply the apple-patterns-check skill rules:
- Force unwraps, try!, fatalError() in production code
- print() statements not in #if DEBUG
- Missing @preconcurrency imports for EventKit/ActivityKit/CoreData/AVFoundation/SwiftData/Speech/Vision/HealthKit
- Task { [weak self] without @MainActor
- Missing nonisolated deinit on @MainActor classes
- Hardcoded isAvailable=true for FoundationModels (must use SystemLanguageModel.default.isAvailable)
- MainActor.assumeIsolated from background queue callbacks
- @Model properties without default values
- Sheet onDismiss + continuation double-resume risk
2. Code cleanliness:
- TODO:/FIXME: without issue links
- Commented-out code blocks (>5 lines)
- Dead code (unreachable, unused variables)
Report each issue as: [SEVERITY] File:Line — Description
Severity: CRITICAL | HIGH | MEDIUM
Agent C — Accessibility Audit (Standard tier)
Spawn as apple-dev-skills:code-reviewer. Prompt:
Run accessibility audit on the SwiftUI views changed in this feature.
Changed Swift files with views: <list files containing 'View' from git diff --name-only HEAD>
Apply ios-accessibility skill rules:
1. VoiceOver: .accessibilityLabel on all interactive elements (Button, Toggle, custom controls)
2. Dynamic Type: font(.body) not hardcoded sizes; no fixed frame heights on text containers
3. Reduce Motion: withAnimation guarded by accessibilityReduceMotion where used
4. Color contrast: no color-only distinction for meaning; check against WCAG AA
Report each issue as: [SEVERITY] File:Line — Description
If no views changed, report: N/A
Completion Checklist
1. Build Verification
- Debug build passes (simulator)
- Archive build passes -- CRITICAL: catches MainActor isolation errors debug misses
- No Swift 6 strict concurrency warnings
- If the app embeds any app extension (
.appex): every one carriesNSExtension.NSExtensionPointIdentifier-- runverify-appex-infoplist.sh --ipa <exported.ipa>. Missing it builds & uploads fine but fails Apple's async processing (error 90348) and silently drops from TestFlight. Seeios-build→ "App Extension Info.plist".
2. Test Verification
- All unit tests pass
- New code has corresponding test coverage
- UI tests pass if views changed
3. Code Quality
Delegate to apple-patterns-check for detailed pattern validation, then verify:
- No
TODO:orFIXME:without issue links - No force unwraps,
try!, orfatalError()in production code - No
print()statements in production code
4. Accessibility
Delegate to ios-accessibility for detailed audit, then verify:
- VoiceOver labels on all interactive elements
- Dynamic Type support verified
- Reduce Motion respected
- Color contrast meets WCAG AA
5. Documentation
- ADR written if architectural decision made
- Project roadmap updated with completion status
- Feature plan moved to completed folder
- Project documentation updated if patterns changed
6. App Store Readiness (if applicable)
- App Store Connect metadata updated
- Screenshots generated if UI changed
- What's New text drafted
- Privacy manifest updated if new data collected
Entitlements Audit (common App Store rejection cause):
# All targets sharing data must have the SAME App Group identifier
grep -r "group\." <app-dir> --include="*.entitlements"
# Verify PrivacyInfo.xcprivacy exists for each extension target
find <app-dir> -name "PrivacyInfo.xcprivacy" -not -path "*/build/*"
# Verify no unused entitlements
grep -r "com.apple.developer" <app-dir> --include="*.entitlements"
Post-Completion Actions
After all checks pass:
- Stage changes:
git add -A - Commit: Follow conventional commits (feat:, fix:, docs:, etc.)
- Push: Only after all checks pass
Example Session
User: /complete-feature "spark-timer"
Claude: Running feature completion workflow for "spark-timer"...
[1/6] Build Verification
Build passed
No Swift 6 warnings
[2/6] Test Verification
Unit tests passed (42 tests)
1 iOS test failing: TimerViewModelTests.testTimerState
[3/6] Code Quality
apple-patterns-check: all passed
No debug prints found
[4/6] Accessibility
VoiceOver labels verified
Dynamic Type not tested — recommend testing on device
[5/6] Documentation
ADR: docs/adr-timer-state-management.md
Roadmap updated
Feature plan not yet in completed/
[6/6] App Store Readiness
N/A — not a user-facing feature
---
Summary:
- 2 warnings to address
- 1 test to fix
- 1 documentation item to complete
Integration with Other Skills
This skill coordinates with:
apple-patterns-check— code pattern validation (Phase 3)ios-accessibility— VoiceOver/contrast verification (Phase 4)verify-against-spec— if the feature was spec-driven, run this firstmerge-check— run after completing, before merging to main
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.