.cursor/skills/ios-release/SKILL.md
Build an iOS release based on an existing git tag. Bumps version to match the tag, builds the shared KMP framework and the iOS app archive. Use when the user asks to make an iOS release, build for App Store, or create an iOS archive.
npx skillsauth add baijum/ukulele-companion ios-releaseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Build an iOS release archive based on an existing version tag created by the github-release skill.
v9.11.0) created via the github-release skillUkuleleCompanion schemeiosApp/setup_onnxruntime.shIf the user specified a tag, validate it exists:
git tag -l v<version>
If no tag was specified, default to the latest tag:
git describe --tags --abbrev=0
Confirm the tag with the user before proceeding.
Read the current MARKETING_VERSION and CURRENT_PROJECT_VERSION in iosApp/UkuleleCompanion.xcodeproj/project.pbxproj.
Set MARKETING_VERSION to match the tag (e.g., tag v9.11.0 -> MARKETING_VERSION = 9.11.0).
Increment CURRENT_PROJECT_VERSION by 1.
Both values appear in four build-settings blocks in project.pbxproj (Debug and Release for the app target, Debug and Release for the test target). Update all four occurrences of each.
Build the release framework for iOS device:
./gradlew :shared:linkReleaseFrameworkIosArm64
Ensure the ONNX Runtime xcframework is present:
bash iosApp/setup_onnxruntime.sh
xcodebuild archive \
-project iosApp/UkuleleCompanion.xcodeproj \
-scheme UkuleleCompanion \
-configuration Release \
-destination 'generic/platform=iOS' \
-archivePath build/UkuleleCompanion.xcarchive
Use block_until_ms: 300000 (archive builds can take several minutes).
Important notes:
CODE_SIGNING_ALLOWED=NO -- the archive must be signed for App Store upload.FRAMEWORK_SEARCH_PATHS for Release configurations must only include the iosArm64/releaseFramework path, not simulator paths. Verify in project.pbxproj if you encounter linker errors about simulator architectures.shared.framework (Kotlin/Native) and onnxruntime.xcframework are static libraries. They must only be linked, never embedded. If they appear in the "Embed Frameworks" build phase in project.pbxproj, App Store validation will fail with MinimumOSVersion errors.
Check with:
ls build/UkuleleCompanion.xcarchive/Products/Applications/UkuleleCompanion.app/Frameworks/
This directory should be empty. If it contains shared.framework or onnxruntime.framework, remove them from the "Embed Frameworks" section in project.pbxproj.
Stage the version change, commit, and push to main:
git add iosApp/UkuleleCompanion.xcodeproj/project.pbxproj
git commit -m "iOS: bump version to <version> (build <buildNumber>)"
git push
open build/UkuleleCompanion.xcarchive
This opens Xcode Organizer where the user can click "Distribute App" > "App Store Connect" > "Upload" to upload the build.
Provide the user with:
v9.11.0)MARKETING_VERSION / CURRENT_PROJECT_VERSION)build/UkuleleCompanion.xcarchive)tools
Record scene video clips for a TOML video project. Reads the android.toml or ios.toml to get the scene list and min_clip_duration, navigates to each screen via ADB (Android) or simctl (iOS), and records individual clips. Use when the user says /record-clips and provides a TOML path.
tools
Upload a release AAB to Google Play Store using the Gradle Play Publisher plugin. Use when the user asks to upload to Play Store, publish to Google Play, deploy to internal testing, promote a release, or mentions Play Console.
development
Promote a release from Google Play internal testing to a closed testing track (Alpha or App Hive Testing). Use when the user asks to promote a release, move to closed testing, push to alpha, push to App Hive Testing, or mentions track promotion.
development
Promote a release to Google Play open testing or production tracks. Supports full rollout and staged rollout to production. Use when the user asks to promote to open testing, beta, go to production, release to all users, staged rollout, or increase rollout percentage.