flame-harness-admob
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.
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 assign app name, slug, and bundle id.
$ npx -y skills add tjdrhs90/flutter-flame-harness --skill flame-harness-plan --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/flame-harness-planContext preview
The summary Claude sees to decide when to auto-load this skill.
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 assign app name, slug, and bundle id.
name: flame-harness-plan description: 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 assign app name, slug, and bundle id. argument-hint: "" allowed-tools: [Agent, Read, Write, Edit, Bash]
Phase 2 of the flutter-flame-harness pipeline. Reads the research spec and `config.md`, then produces a comprehensive game PRD in the project's `default_language`, maps the `lib/` directory structure, assigns the app identity (`app_name`, `app_slug`, `bundle_id`), and advances the pipeline state to `design`.
All file schemas (`config.md`, `state.md`, `pipeline-log.md`) are defined in `docs/harness-protocol.md` — refer to that document as the single source of truth. Do not redefine schemas here.
---
Extract:
| Key | Use | |---|---| | `app_idea` | Refined concept tagline written by the research phase | | `app_name` | Display name (may be blank — set it here if so) | | `app_slug` | Kebab-case identifier (may be blank — derive it here if so) | | `bundle_id` | App bundle ID (may be blank — set it here) | | `default_language` | The user's conversation language (set by the orchestrator); the PRD and all copy are written in it |
If `config.md` does not exist, abort with: `flame-harness-plan: docs/harness/config.md not found — run the orchestrator to bootstrap first.`
Find the most recent file matching `docs/harness/specs/*-research.md` (sort by filename descending, take the first). If no spec file exists, abort with: `flame-harness-plan: no research spec found in docs/harness/specs/ — run flame-harness-research first.`
Extract from the spec:
---
Derive and assign the app identity **before** writing the PRD so that the PRD can reference the final values.
Use the working title from the research spec as the display name. Capitalise each word. Example: `"space hop"` → `"Space Hop"`.
The `app_slug` is a **kebab-case** identifier derived from `app_name`:
1. Lowercase the display name. 2. Replace all spaces and special characters with hyphens. 3. Strip leading/trailing hyphens and collapse consecutive hyphens to one. 4. Example: `"Space Hop!"` → `"space-hop"`.
The slug is used as the last segment of the bundle ID and as the directory name in CI/CD paths. Do not use underscores — kebab-case only.
The bundle id is part of the app's identity and is decided **here, up front** (the user sees it in the PRD). Format — reverse-DNS **`com.<company>.<appname>`**:
own `credentials/store-metadata.md`, collected at bootstrap; never a hard-coded company name).
`[a-z0-9]+`; hyphens/underscores/uppercase are INVALID and break iOS/Android signing).
So `bundle_id` = `com.<company>.<appname>`. Examples: `app_slug: space-hop` → **`com.<company>.spacehop`**; `app_slug: swing-line` → **`com.<company>.swingline`** (NOT `com.<company>.space-hop`). State the chosen `bundle_id` explicitly in the PRD identity section. It must be byte-identical on iOS and Android (`docs/harness-protocol.md` §1).
Decide the game's **single** locked orientation from the concept and record it in the PRD: `portrait` (default — most casual/one-hand games) or `landscape` (inherently wide play: side-scroll platformers, twin-stick, landscape racers). The game ships locked to this one orientation (the generator removes the other natively — no rotate-on-launch).
Use `Edit` to update `config.md` with the identity keys + orientation:
app_name: "<display name>" app_slug: "<kebab-case-slug>" bundle_id: "com.<company>.<id>" # <id> = app_slug with hyphens/underscores removed orientation: portrait # or "landscape"
Make targeted edits — do not rewrite the entire file.
---
Write the PRD **entirely in `default_language`** (the language the user is conversing in). Headings and body in that language. The template below shows Korean headings as an example for a Korean project — translate the headings to `default_language` (e.g. English) when the project language is not Korean. The only exceptions are:
Use the following structure verbatim. A fresh Claude must be able to fill every section from the research spec alone — no guessing required.
# 게임 기획서 (PRD) — <app_name> > **버전:** 1.0 > **작성일:** <YYYY-MM-DD> > **작성자:** flame-harness-plan > **번들 ID:** com.<company>.<id> (slug에서 하이픈·언더스코어 제거) --- ## 1. 장르 및 컨셉 (Genre & Concept) - **장르:** <e.g. 하이퍼캐주얼 러너 / 타워 디펜스 / 퍼즐> - **한 줄 설명:** <tagline from research spec, translated to Korean> - **핵심 차별점:** <differentiator from research spec, in Korean> - **대상 연령:** <target age group> --- ## 2. 코어 루프 (Core Loop) 플레이어가 10–30초마다 반복하는 핵심 행동을 단계별로 기술한다. 1. <단계 1> 2. <단계 2> 3. <단계 3> ... --- ## 3. 게임 메카닉 (Game Mechanics) ### 3.1 조작 방법 (Controls) | 플랫폼 | 조작 | 결과 | |---|---|---| | iOS/Android | <tap / swipe / hold> | <action> | ### 3.2 핵심 메카닉 (Core Mechanic) <2-4 sentences describing the primary mechanic in Korean> ### 3.3 보조 메카닉 (Secondary Mechanics) <Bullet list of 2-4 secondary mechanics> --- ## 4. 콘텐츠 지표 (Content Metrics) | 항목 | 목표값 | |---|---| | 레벨 수 | <number> | | 적 종류 수 | <
A Claude Code plugin that takes a Flutter/Flame game from raw idea all the way to the app stores.
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.
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.