flame-harness-build
Phase 8 — bootstrap signing credentials, generate fastlane config from templates, and build + upload signed IPA (TestFlight) and AAB (internal track).
Phase 7 — analyze the game, decide a rewarded-ad strategy, guide manual AdMob ad-unit creation, and inject google_mobile_ads + ATT/UMP consent code.
$ npx -y skills add tjdrhs90/flutter-flame-harness --skill flame-harness-admob --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/flame-harness-admobContext preview
The summary Claude sees to decide when to auto-load this skill.
Phase 7 — analyze the game, decide a rewarded-ad strategy, guide manual AdMob ad-unit creation, and inject google_mobile_ads + ATT/UMP consent code.
name: flame-harness-admob description: Phase 7 — analyze the game, decide a rewarded-ad strategy, guide manual AdMob ad-unit creation, and inject google_mobile_ads + ATT/UMP consent code. argument-hint: "" allowed-tools: [Agent, Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion]
Phase 7 of the flutter-flame-harness pipeline. Analyzes the game's loop, decides where rewarded ads fit naturally, guides the user through manual ad-unit creation in the AdMob console, then injects `google_mobile_ads`, iOS ATT, and UMP consent code.
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 the `admob:` block; §2 for `state.md`; §6 for log schemas; §7 for the `admob → build` transition and the `skip_admob` branch rule). Do not redefine schemas here.
---
Before any action, load:
1. `docs/harness/config.md` — extract `app_slug`, `app_name`, and `skip_admob` (bool). 2. `docs/harness/state.md` — confirm `next_role: admob`. 3. PRD at `docs/harness/prd.md` — read the game loop, monetization intent, and any explicit ad placement requests.
---
Check `skip_admob` from `docs/harness/config.md` immediately after loading inputs.
If `skip_admob: true`:
1. Write `docs/harness/config.md` with `admob.enabled: false` (per protocol §1 `admob:` block). 2. Write `docs/harness/state.md` with:
status: running current_phase: admob next_role: build updated_at: "<ISO-8601 UTC now>"
3. Append to `docs/harness/pipeline-log.md` (per protocol §6):
| <ISO-8601 UTC now> | complete | admob | skip_admob=true; AdMob skipped; next: build |
4. Exit immediately. Do not ask questions, do not inject code.
---
Read the PRD and game loop carefully. The goal is rewarded ads that feel like a natural reward mechanic, not an interruption.
continue?". This is the highest-converting rewarded placement for Flame games.
coins earned.
Choose placements that match the PRD's described game loop. Document the chosen placements explicitly — a fresh Claude running `flame-harness-generator` must know exactly where to add the `RewardedAdHelper.show()` call.
Do **not** add interstitial ads unless the PRD explicitly requests them. Interstitials between levels or at session start hurt retention and risk App Store policy violations. Rewarded ads are opt-in and always preferred.
Add a banner ad only if the PRD explicitly requests one. If a banner is used, apply the SafeArea banner gap pattern: wrap the game canvas in a `Column` with a `SafeArea`-padded `BannerAdWidget` at the bottom so the ad never overlaps game content.
---
Google's API cannot create AdMob ad units programmatically. The user must create them manually in the AdMob console. Follow these steps:
Use `AskUserQuestion` to ask the user:
> "Please open the AdMob console (https://admob.google.com) and: > 1. Add your iOS app → copy the **iOS App ID** (format: `ca-app-pub-XXXX~YYYY`). > 2. Add your Android app → copy the **Android App ID** (format: `ca-app-pub-XXXX~ZZZZ`). > > Paste both IDs here. If you haven't done this yet, type 'defer' and I'll pause."
If the user types `defer` or says they haven't done it yet, write `docs/harness/state.md` with:
status: paused current_phase: admob next_role: admob pause_reason: manual_action updated_at: "<ISO-8601 UTC now>"
Then stop. The harness will resume when the user runs `flame-harness-resume`.
For each rewarded placement identified in the Strategy section, use `AskUserQuestion` to ask the user to create a rewarded ad unit in the AdMob console and paste back both the iOS and Android unit IDs. Example for a "revive" unit:
> "In the AdMob console, under your app → Ad units → Add ad unit → Rewarded: > - Unit name: `<app_slug>_rewarded_revive` > - Copy the **iOS unit ID** (format: `ca-app-pub-XXXX/IIII`) and the > **Android unit ID** (format: `ca-app-pub-XXXX/AAAA`). > > Paste both here. Type 'defer' to pause."
Again apply the same `pause_reason: manual_action` pause if the user defers.
Once all IDs are collected, write the `admob:` block in `docs/harness/config.md` (per protocol §1):
admob:
enabled: true
ios_app_id: "ca-app-pub-XXXX~YYYY"
android_app_id: "ca-app-pub-XXXX~ZZZZ"
ad_units:
- key: rewarded_revive
ios_id: "ca-app-pub-XXXX/IIII"
android_id: "ca-app-pub-XXXX/AAAA"
format: rewarded
# add one entry per placement---
After collecting IDs, inject the integration code into the Flutter project at `<projects-dir>/<app_slug>/`.
dependencies: google_mobile_ads: ^5.1.0 app_tracking_transparency: ^2.0.6
Run `flutter pub get` after editing.
Read `default_language` from `docs/harness/config.md`. The configured App Store localizations are `default_language` **plus English when `default_language ≠ en`** — the same set as the l10n Hard Gate. The ATT prompt string must exist in **every** one of them, or you get a repeat rejection: a reviewer (or user) in another locale sees a foreign-lan
A Claude Code plugin that takes a Flutter/Flame game from raw idea all the way to the app stores.
Phase 8 — bootstrap signing credentials, generate fastlane config from templates, and build + upload signed IPA (TestFlight) and AAB (internal track).
Phase 4 — propose verifiable completion criteria and mandatory hard gates; reach AGREED (1-pass default, multi-round negotiation in --strict).
Phase 3 — define the Flutter design_tokens.dart spec (palette, typography, spacing), the game's art/visual concept, and the asset/audio sourcing plan.
Phase 6 — skeptical QA. Run the game, watch it, then judge against the contract. Default = functional check; --strict adds quality and edge-case passes.
Phase 5 — build the Flame game in 3 gated sub-phases (core loop → systems+components → UI+content), then self-evaluate against the contract.
Phase 2 — write the game PRD in the project's default_language (core loop, mechanics, content metrics, win/lose, scope guard), map the lib/ structure, and…