tjdrhs90/flutter-flame-harness/flame-harness-build
Claude Code and agent skill by tjdrhs90/flutter-flame-harness
- community
- ext:[{"type":"hook","description":"Pre/post lifecycle hooks"}]
Checking that the SKILL.md file is still in the repository.
Phase 8 — bootstrap signing credentials, generate fastlane config from templates, and build + upload signed IPA (TestFlight) and AAB (internal track).
Install
npx vskill@latest install tjdrhs90/flutter-flame-harness/flame-harness-buildSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
flame-harness-build
Phase 8 of the flutter-flame-harness pipeline. Bootstraps signing credentials into the generated game, generates fastlane config from the Task 3 templates, then builds and uploads a signed IPA to TestFlight and a signed AAB to the Play Store internal track.
All file schemas (config.md, state.md, pipeline-log.md) and the phase transition table are defined in docs/harness-protocol.md — that document is the single source of truth (§1 for config.md including credentials_dir, ios, and android blocks; §2 for state.md; §6 for log schemas; §7 for the build → screenshot transition and the status: running rule). Do not redefine schemas here.
Prerequisites: An App Store Connect app record and a Google Play Console app must already exist (created once manually). The upload lanes will fail without them. Fastlane and Ruby must be installed on the developer's macOS machine (Xcode and the flutter CLI are assumed present).
Input — Read Inputs
Before any action, load:
docs/harness/config.md— extractapp_slug,bundle_id,app_name, andcredentials_dir
(per protocol §1). Also read ios.asc_key_id and android.key_alias.
docs/harness/state.md— confirmnext_role: build(per protocol §2).
Derive the game root path: <projects-dir>/<app_slug>/.
Phase 1 — Credential Bootstrap
Copy signing credentials from the shared credentials_dir (per protocol §1 — skills must not hard-code credential paths; always read credentials_dir from config.md) into the game's platform directories.
iOS credentials
The .p8 filename encodes the ASC key ID from config.md ios.asc_key_id. The certs/ directory holds the downloaded distribution certificate and provisioning profile (written by fastlane certs).
Android credentials
Android keystore
Check whether <credentials_dir>/upload-keystore.jks exists.
- If it exists: copy it.
``bash cp <credentials_dir>/upload-keystore.jks <game>/android/upload-keystore.jks ``
- If it is missing: generate a new keystore with
keytool. Use the alias and password
defined in config.md android.key_alias (default: upload). Store and key passwords are both <keystore-password>.
``bash keytool -genkey -v \ -keystore <game>/android/upload-keystore.jks \ -alias upload \ -keyalg RSA -keysize 2048 -validity 10000 \ -storepass <keystore-password> -keypass <keystore-password> \ -dname "CN=<company>, OU=Dev, O=<company>, L=Seoul, S=Seoul, C=KR" ``
android/key.properties
Write <game>/android/key.properties by substituting the templates/key.properties.template values (placeholders are already concrete — the template uses literal values matching the keystore generated above):
The storeFile path is relative to the android/ directory, which is where Gradle reads it.
Phase 2 — Fastlane Config Generation
Generate fastlane Appfile and Fastfile for both platforms by substituting the following placeholders in the templates located at templates/fastlane/:
| Placeholder | Value | |
|---|---|---|
__APP_ID__ | bundle_id from config.md | |
__PACKAGE__ | bundle_id from config.md | |
__IPA_NAME__ | <app_name>.ipa (spaces allowed; use the value of app_name verbatim) | |
__PROFILE_NAME__ | <bundle_id> AppStore (e.g. com.<company>.mygame AppStore) |
Note: __PROFILE_NAME__ is used both as the Xcode code-signing profile name and as the .mobileprovision filename (with .mobileprovision appended by fastlane). Spaces are acceptable.
iOS fastlane
Android fastlane
After substitution, verify with grep '__' <game>/ios/fastlane/Appfile <game>/ios/fastlane/Fastfile <game>/android/fastlane/Appfile <game>/android/fastlane/Fastfile — output must be empty (no unresolved placeholders).
Phase 3 — Build and Upload
Run all build commands from the game root (<projects-dir>/<app_slug>/).
Pre-build platform requirements
Before building, ensure the platform items in docs/game-gotchas.md (Build/platform + Store rejections) are in place — these are submit-blockers if missing: iOS PrivacyInfo.xcprivacy registered (iOS 17+), Android minSdk = 23 + core-library desugaring, iOS Podfile platform bumped, Info.plist ATT + SKAdNetworkItems, and ITSAppUsesNonExemptEncryption = false (skip the export-compliance prompt). Bump the build number on every upload — App Store Connect rejects a duplicate build number, so increment it (don't reuse 1).
Re-run / resume safety (store uploads are NOT idempotent): if this phase is re-entered after a partial or failed upload, bump the build number again before re-uploading — re-sending the same build number fails on ASC and can create a stuck/duplicate build on Play. Verify in App Store Connect / Play Console whether the prior build actually landed before retrying; never blindly re-run the upload lane with the same number.
iOS — Signed IPA → TestFlight
fastlane beta calls get_provisioning_profile, update_code_signing_settings, build_app, and upload_to_testflight (defined in the generated Fastfile). The lane sets skip_waiting_for_build_processing: true so it does not block waiting for Apple's processing.
Android — Signed AAB → internal track
fastlane internal calls upload_to_play_store with track: "internal" and the relative AAB path ../build/app/outputs/bundle/release/app-release.aab (defined in the generated Fastfile).
Build failure handling
- If
fastlane certsfails with a certificate error, check that the Apple Distribution
certificate is valid in Keychain Access, then re-run.
- If
fastlane betafails with a profile not found error, ensure the app record exists in App
Store Connect (prerequisite above) and re-run fastlane certs first.
- If
flutter build appbundle --releasefails, runflutter analyzeto identify compilation
errors and fix them before retrying.
- If
fastlane internalfails with a401or credential error, verify that
android/fastlane/play-store-key.json was copied correctly and that the service account has the Release Manager role in Play Console.
Output — Write Handoff and State
handoff/build-result.md
Write docs/harness/handoff/build-result.md with the following layout:
Fill <N> with the actual build number / version code reported by fastlane output.
state.md
Write docs/harness/state.md atomically (per protocol §7 build → screenshot transition and §7 rule 2 — set status: running in the same write as next_role):
Leave current_round, created_at, resume_attempts, and pause_reason unchanged.
pipeline-log.md
Append one row to docs/harness/pipeline-log.md (per protocol §6):
Error Handling and Pausing
If either upload fails and cannot be resolved immediately, write docs/harness/state.md with:
Then explain what manual action is required. The harness will resume when the user runs flame-harness-resume (per protocol §7 pause/resume rules).
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/flame-harness-build/SKILL.md
Popularity
- Repository stars
- 61
- Repository forks
- 6
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Extension points
hookPre/post lifecycle hooks
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/tjdrhs90/flutter-flame-harness/flame-harness-build)