A series of agent skills that scaffold a Flutter + Firebase project end to end — empty directory → tested, emulator-backed app on a strict architecture. Skills are plain SKILL.md + examples; any coding agent that supports the skill format can load them.
skills/<name>/— editable skill source (SKILL.md + examples).dist/<name>.skill— packaged (zipped) skills for install/sharing.AGENTS.md— architecture conventions + pipeline order (read for the contract).
| Skill | What it does |
|---|---|
| create-app-from-prompt | Orchestrator. Interviews you → PRD-PRODUCT.md → implements → E2E tests. Entry point for a whole app. |
| app-architecture-scaffold | Layered feature-first lib/ structure (bloc, get_it/injectable, auto_route, domain error enums, fpdart at usecase). |
| flavors-env-setup | dev/staging/prod flavors, per-flavor Firebase projects. |
| firebase-emulators-setup | Local Emulator Suite, flag-guarded wiring. |
| e2e-test-scaffold | Acceptance criteria → integration tests vs emulators. |
Skills fire from their description. Just describe the goal to the agent:
- "Build a new Flutter Firebase app for a mood diary" →
create-app-from-prompt - "Set up clean architecture for this Flutter app" →
app-architecture-scaffold - "Add dev/staging/prod flavors" →
flavors-env-setup - "Run Firebase locally / use emulators" →
firebase-emulators-setup - "Write E2E tests from these acceptance criteria" →
e2e-test-scaffold
Or invoke explicitly by name if it doesn't trigger.
Start with the orchestrator:
"Use create-app-from-prompt to build my app."
It runs, in strict order:
- Preflight — checks flutter/dart/firebase CLI, Firebase login + project, loads helper skills.
- Interview — asks Description / Features / Acceptance, writes
PRD-PRODUCT.md. Sample:skills/create-app-from-prompt/examples/PRD-PRODUCT.md. - Implementation —
flutter create, architecture,flutterfire configure, packages (examples/pubspec.yaml), per-feature slices. - E2E tests — every acceptance criterion → integration test vs emulator.
Run the CLI steps, then the skills in order (see AGENTS.md):
flutter create --org com.acme --platforms ios,android my_app # plain CLI
flutterfire configure --project=<id> --out=lib/firebase_options.dartthen app-architecture-scaffold → flavors-env-setup →
firebase-emulators-setup → e2e-test-scaffold.
The SKILL.md format is Anthropic's Agent Skills. Where a folder goes decides its scope. For a new project you're scaffolding, commit them project-scoped so the team shares them via git.
| Scope | Directory | Use when |
|---|---|---|
| Project, agent-neutral (recommended) | <project-root>/.agents/skills/<name>/ |
Vendor-neutral; any agent that reads AGENTS.md/.agents/. Committed to git |
| Project, Claude Code | <project-root>/.claude/skills/<name>/ |
Claude Code specifically; committed to git, shared with the team |
| Personal | ~/.claude/skills/<name>/ |
Available across all your projects |
| Plugin bundle | <plugin>/skills/<name>/ |
Distributing as a plugin (namespaced under the plugin) |
| Other agents | the agent's configured skills dir | Anything else — check that agent's docs |
Project skills load from the skills dir in the start dir and every parent up to the repo root, and take effect within the session (no restart). For a fresh Flutter app, drop the ones you need into <new-app>/.agents/skills/ (agent-neutral) or <new-app>/.claude/skills/ (Claude Code). Paired with the project's AGENTS.md, .agents/skills/ keeps everything under one vendor-neutral tree.
Each dist/<name>.skill is a zip of the skill folder (<name>/SKILL.md + examples).
Two ways to make an agent see them:
- Folder (simplest): copy
skills/<name>/into the target skills directory (see table). No packaging needed:cp -r skills/create-app-from-prompt <new-app>/.claude/skills/
- Packaged: import the
.skillfile via the agent's skill-install flow, or unzip it into the skills directory:unzip dist/create-app-from-prompt.skill -d <new-app>/.claude/skills/
Verify: the skill's name appears in the agent's available skills; describe a matching task and confirm it triggers.
Source in skills/ is the truth. After editing a SKILL.md or example, refresh its .skill:
cd skills && zip -rq ../dist/<name>.skill <name> -x '*/.gitkeep'- Layered:
presentation → domain → data. Firebase types only indata;domainframework-free. - Repos + datasources:
abstract interface class, plainFuture, throw on failure. No fpdart. TaskEither<ErrorEnum, T>only at the usecase layer.- Domain errors = enums; presentation translates them via localization.
- Emulators for dev + tests — never hit live Firebase in tests.
- Every acceptance criterion maps to ≥1 E2E test that verifies real emulator DB state.