Appstore push release build
Skill jimmynotjames/simple-recurring-budgets/.cursor/skills/appstore-push-release-build
Wren: An iOS app for fast, easy budgeting on the go
npx -y skills add jimmynotjames/simple-recurring-budgets --skill appstore-push-release-buildAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 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.
What its author says it does
Copied from the file, not written here
Build and upload the App Store release-candidate build — confirms the release checklist has been worked through, prompts for the new App Store version number, bumps MARKETING_VERSION on a release branch, then runs `fastlane ios beta` so the candidate lands in TestFlight (auto-bumps build number from ASC, archives, uploads, auto-commits the pbxproj bump), then pushes, opens a chore PR, waits for CI, and squash-merges. The same binary is then manually tested via TestFlight and attached to the App Store version in ASC — one build serves both. Does NOT submit for review — that stays a manual App Store Connect step. Use when the release checklist reaches the release-candidate build step, or when asked to push a release build. Invoked via /appstore:push-release-build.
SKILL.md
8.5 KB, as published. Nobody here has run it
Push the App Store release-candidate build
Produces the one binary that serves both the final TestFlight test and the App Store submission: version bump → branch → build → upload to TestFlight → commit → PR → CI → merge. TestFlight builds and App Store submissions draw from the same build pool in ASC, so the exact build the user tests is what gets attached to the version and submitted — no separate App Store archive. Submitting for review remains a manual ASC click.
Relationship to siblings: this wraps the same fastlane ios beta lane as
appstore-push-testflight-build, adding the release-checklist confirmation
and the MARKETING_VERSION bump. (The dormant fastlane ios release lane —
a separate full-binary upload via deliver — is NOT used in this flow.)
The beta lane does the heavy lifting: verifies ship secrets
(scripts/verify_release_secrets.sh), queries ASC for the next build number,
bumps CURRENT_PROJECT_VERSION in project.pbxproj, archives and exports the
.ipa, uploads to TestFlight, and auto-commits the pbxproj change.
Preconditions
Normally invoked from /appstore:prepare-for-release with the checklist's
Phases 0–3 complete. Either way, step 1 always asks the user to confirm the
checklist has been worked through — this skill bakes a binary; it must not
run against unfinished release prep:
- Metadata already pushed and current (
python3 scripts/translate_metadata/check_metadata.pyexits 0). - Screenshots already pushed and current (or deliberately unchanged).
- Gate green on
main.
Progress checklist
Print this unchecked at the start; re-print with - [x] as each step completes.
- Prep + version — user confirmed checklist prep and the new version number
- Pre-flight — clean working tree, on
main, up-to-date withorigin - Branch — create
u/jimmyho/claude-code/release-vX.Y.Z - Version bump —
MARKETING_VERSIONset + committed - Build & upload —
fastlane ios betarunning in background (~10–15 min) - Verify commit — lane auto-committed
chore(release): set build number to N - Push — branch pushed to
origin - PR — chore PR opened; record PR number
- CI —
wait_ci.shrunning in background; re-invoked on completion - Merge — squash-merge; branch cleaned up
Recipe
1. Confirm prep + version number — always prompt, never assume
Read the current value:
grep MARKETING_VERSION simple-recurring-budgets.xcodeproj/project.pbxproj | head -2
Then ask the user (one AskUserQuestion call, three questions):
- "Have you worked through the release checklist —
/appstore:prepare-for-release, or manually throughdocs/app-store-release-checklist.mdPhases 0–3?" If an in-flight snapshot exists inreleases/, cite its state alongside the question. A no (or "not sure") means stop and route to/appstore:prepare-for-releaseinstead of building. - The new App Store version number, showing the current
MARKETING_VERSIONand, if known, the version ASC is expecting. The version is a product decision — even if the checklist snapshot already names one, confirm it here before it gets baked into a binary. - "Are screenshots and metadata for this release already pushed (or deliberately unchanged)?" A no means stop and finish the checklist's Phase 2 first — the binary can upload regardless, but a candidate built before the listing is final invites a mismatched submission.
2. Pre-flight
git status --porcelain
git branch --show-current
git fetch origin
git log HEAD..origin/main --oneline
- Dirty working tree: stop and ask the user to commit or stash first.
(Exception: an in-flight release-checklist snapshot in
releases/is fine.) - Not on
main: stop and confirm before building a release candidate from a non-main branch. - Behind
origin/main:git pull --ff-only.
3. Create the release branch
git checkout -b u/jimmyho/claude-code/release-vX.Y.Z
4. Bump MARKETING_VERSION and commit
Update every MARKETING_VERSION = …; occurrence in
simple-recurring-budgets.xcodeproj/project.pbxproj with the Edit tool
(replace_all), then verify:
grep MARKETING_VERSION simple-recurring-budgets.xcodeproj/project.pbxproj
Commit it separately from the lane's build-number auto-commit so history
stays legible. Write the message to tmp/commit-msg.txt with the Write tool
(never heredoc):
chore(release): bump version to X.Y.Z
Co-Authored-By: <standard Claude co-author footer>
git add simple-recurring-budgets.xcodeproj/project.pbxproj
git commit -F tmp/commit-msg.txt
5. Build & upload — fastlane ios beta
Run in the background (run_in_background: true):
fastlane ios beta 2>&1 | tee tmp/release-build.log
The lane (~10–15 min): verifies ship secrets → sets the real next build
number from ASC → archives and exports with -allowProvisioningUpdates →
uploads to TestFlight (skip_waiting_for_build_processing: true) →
auto-commits chore(release): set build number to <N>.
Do not use the Monitor tool for ticks — it prompts on each re-arm. Track
progress on 5-minute background sleep ticks instead (memory
feedback_no_prompt_periodic_progress): launch sleep 300 in the background;
on its completion, read the last 10 lines of tmp/release-build.log, report a
one-line status, re-arm; stop when the fastlane task exits.
6. Verify the auto-commit
git log --oneline -3
tail -60 tmp/release-build.log
Auto-commit present: record the build number N. Proceed to step 7.
Failure branches (no auto-commit + error in the log): surface the last 80 lines and stop — the version-bump commit stays on the branch, so the lane can be re-run after the fix.
- Ship-secrets guard tripped — configure
config/Secrets.local.xcconfigperCONTRIBUTING.md § B, then re-run. - Signing failure —
fastlane ios verify_auth; check the distribution cert and profile in Xcode / ASC. - Archive failure — compiler error in the log; fix and re-run from step 5.
- Upload failure (ASC HTTP 500) — transient; wait a few minutes and re-run.
Upload succeeded but no commit (rare): stage
simple-recurring-budgets.xcodeproj/project.pbxproj, read N from the file,
and commit chore(release): set build number to <N> manually via
tmp/commit-msg.txt.
7–10. Push, PR, CI, merge
Same flow as appstore-push-testflight-build steps 5–8:
git push -u origin u/jimmyho/claude-code/release-vX.Y.Z
gh pr create --title "chore(release): vX.Y.Z — bump version and upload build <N>" --body-file tmp/pr-body.md
sleep 15
gh run list --branch u/jimmyho/claude-code/release-vX.Y.Z --limit 1 --json databaseId --jq '.[0].databaseId'
bash scripts/wait_ci.sh <run-id> <pr-number> # run_in_background: true
gh pr merge <pr-number> --squash --delete-branch
git checkout main && git pull --ff-only
git branch -D u/jimmyho/claude-code/release-vX.Y.Z
git fetch --prune
PR body (via tmp/pr-body.md, Write tool): What = version bump to X.Y.Z +
release-candidate build <N> uploaded to TestFlight for App Store submission;
cross-cutting concerns section all N/A (build infrastructure only).
Done — hand back to the checklist
Report: "Release candidate build <N> (vX.Y.Z) is uploaded and the PR is
merged. Apple takes ~30 min to process it; then install build <N> via
TestFlight for the final manual test (Settings must show vX.Y.Z (<N>) with no
'Debug' badge). That exact build is what you attach to the version in ASC and
submit for review — nothing has been submitted yet." If running under
/appstore:prepare-for-release, mark the corresponding snapshot items and
continue the checklist.