One agent skill that makes any Flutter app come out in the owner's structure —
battle-tested across multiple production Flutter apps, with scope discipline built in
and the owner's fdev CLI wired into the workflow.
- The frontmatter
descriptiontriggers the skill automatically on any Flutter task (new app, feature, screen, cubit, API, theme, router, bug, test). SKILL.mdholds the 12 laws, workflow, red flags, rationalization table, and the evidence-before-done gate. Heavy detail lives inreferences/and is loaded only when the task needs it.- Structure is non-negotiable; scope is lazy. The ponytail ladder is built in, so the skill enforces the house architecture while refusing unneeded packages, abstractions, and widgets.
The skill operates as the senior engineer who owns the task end to end:
- Profile before changing — architecture, state, routing, DI, networking, models, tests, design system, mode — then plan.
- Existing project conventions > skill defaults > generic preference. Greenfield uses the defaults; existing projects are mirrored, not rewritten; migrations only on request, staged.
- Owns the obvious work — states, validation, DI, routes, constants, tests, platform config — without asking about trivia.
- Definition of Done + evidence report (Implemented / Files changed / Verification / Not verified / Notes) — never "Done." without proof.
- Audit capability —
scripts/audit.sh <app> [--perf]mechanical pass + agent review perreferences/auditing.md; release readiness viascripts/release-check.sh <app>. - Full lifecycle coverage — auth (Google/Apple), performance, security, accessibility, localization, dependencies, native config, releases, store submission, fastlane/Codemagic, and Shorebird OTA updates.
tests/consistency.sh # links, version sync, placeholders, script syntax (seconds)
tests/run.sh # installer + scaffold + feature generator + audits (needs Flutter)Behavior cases live in evals/ (protocol in evals/README.md, results in evals/RESULTS.md).
There is no CI by design — the tests run locally, and they must be green before a release.
See CONTRIBUTING.md to propose changes.
"Implement order history with pagination"
→ profile the project (architecture, state, routing, DI, net, design system)
→ find the closest existing feature and mirror it
→ plan: entity → repo → model → data source → use case → state → cubit → UI → route → tests
→ implement all states (loading/error/empty/success) + edge cases
→ self-review the diff (layers, reuse, scope, security, regression)
→ verify: dart format · fdev gen · flutter analyze · flutter test
→ report: Implemented / Files changed / Verification / Not verified / Notes
Real run on this machine — macOS · Flutter 3.38.9 · Dart 3.10.8 · warm caches · 2026-09-24. The "typical manual" column is a conservative estimate for producing the same verified result by hand; it is not a controlled study. The measured column is reproducible with the commands below.
| Task | Typical manual (estimate) | With flutter-superpower (measured) |
|---|---|---|
| New app skeleton — 46 Dart files: layers, DI, theme, router, constants, design system, tests | 2–4 h | 19.1 s — scripts/new_app.sh |
| New feature — 10 files across data/domain/presentation + codegen + endpoint constant + route snippet | 1–2 h | 9.8 s — scripts/new_feature.sh |
| Architecture audit of a 530-file production app | 1–2 h of manual review | 0.9 s mechanical pass + agent review |
| Verify a change (format → analyze → test) | minutes, easy to skip | 8.2 s — enforced by the evidence gate |
| Behavior compliance | — | 7/7 eval cases passed, 40+ tests generated |
Measured pipeline timings (seconds, same machine)
scaffold app ████████████████████ 19.1
generate feature ██████████ 9.8
flutter test ██████ 5.8
flutter analyze ███ 2.5
audit (530 files) █ 0.9
Reproduce: scripts/new_app.sh bench --dir /tmp/bench · scripts/new_feature.sh orders --app /tmp/bench ·
scripts/audit.sh /path/to/app --static · tests/run.sh.
- Feature-first clean architecture:
lib/features/<x>/{data,domain,presentation}+lib/core/+lib/di/ flutter_blocCubits +SafeCubit+ sealed/freezed statesget_it+injectableDI (@injectablecubits,@LazySingleton(as:)repos)go_routerwithstatic const path/routeNameper screen + typed route-datadio+Either<Failure, T>+safeApiCall/ErrorHandlerjson_serializablemodels extending Equatable entities- Centralized constants: colors, text styles, strings, API paths, storage keys
flutter_screenutil(390×844 / 375×812) +AppSizestokens- Design system:
KButton,KTextField,ImageRenderer, empty/error/loading, shimmer, custom snackbar - dev/prod flavors via
dotenv+AppConfig/FlavorConfig AppLoggerdev-only;flutter analyze+flutter test+dart formatgatefdevCLI for codegen, builds, clean, env, keystores, Swagger models
flutter-superpower/
├── README.md
├── SKILL.md ← entry point: laws, workflow, red flags, evidence gate
├── CHANGELOG.md
├── AGENTS.md ← guidance for agents editing this skill
├── INSTALL.md ← agent-executable install instructions
├── CODE_OF_CONDUCT.md · CONTRIBUTING.md · SECURITY.md · LICENSE
├── assets/ ← banner and media assets
├── evals/ ← 20 behavior cases + protocol + recorded results
├── tests/ ← consistency.sh (fast) + run.sh (Flutter regression)
├── scripts/
│ ├── setup.sh ← one-command remote setup (curl | sh)
│ ├── install.ps1 ← Windows installer
│ ├── install.sh ← cross-agent installer
│ ├── audit.sh ← read-only project audit (mechanical report)
│ ├── new_app.sh ← scaffold a full app skeleton (analyze-clean)
│ └── new_feature.sh ← generate a feature: all layers + codegen + route snippet
├── templates/
│ ├── app/ ← skeleton copied by new_app.sh
│ ├── feature/ ← feature files copied by new_feature.sh
│ └── pointer-snippet.md ← AGENTS.md / Cursor-rule pointer for non-skill agents
└── references/
├── architecture.md ← layers, folders, naming, feature template
├── state-and-di.md ← cubits, states, injectable wiring
├── routing.md ← go_router, route data, guards, shells
├── networking-and-errors.md ← DioClient, interceptors, Either, logging
├── models-and-storage.md ← entities/models/json, prefs, secure storage
├── theme-and-design-system.md ← colors, text, sizing, K-widgets, strings
├── app-bootstrap.md ← main(), flavors, DI boot, Firebase/FCM
├── playbooks.md ← new-app-from-zero + new-feature recipes
├── debugging.md ← loop, symptom→layer, house failure modes
├── testing.md ← fakes, cubit/widget/model tests, no mockito
├── ci-cd.md ← GitHub Actions, secrets, release flow
├── chat-realtime.md ← Socket.IO, E2E crypto, optimistic send
├── maps-location-health.md ← maps, geolocation, permissions, steps
├── reviewing.md ← two-axis diff review: Standards + Spec
├── senior-mode.md ← senior engineer behavior: profile, modes, DoD, reports
├── auditing.md ← project audit dimensions + report format
├── performance.md ← rebuilds, lists, images, startup, memory
├── app-optimization.md ← level-wise optimization plan (implement/plan/skip)
├── security.md ← secrets, log redaction, storage, transport, hardening
├── accessibility.md ← semantics, targets, text scaling, contrast, focus
├── localization.md ← StringConstants vs ARB, plurals, intl, RTL
├── dependencies.md ← add/remove discipline and evaluation
├── native.md ← Android/iOS triage, flavors, signing, pods
├── release.md ← release checklist + release-check.sh
├── auth-social.md ← Google & Apple sign-in end to end
├── store-release.md ← Play + App Store submission and rejections
├── fastlane-codemagic.md ← fastlane lanes + codemagic.yaml
├── shorebird.md ← OTA code push: patchability, tracks, compliance
├── ponytail.md ← scope discipline / anti-over-engineering
└── fdev.md ← owner's fdev CLI command map
Let your agent do it — paste into any agent that can fetch a URL:
Fetch and follow https://raw.githubusercontent.com/rahulshahDEV/flutter-superpower/main/INSTALL.md
One-liner (macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/rahulshahDEV/flutter-superpower/main/scripts/setup.sh | shWindows (PowerShell):
iwr -useb https://raw.githubusercontent.com/rahulshahDEV/flutter-superpower/main/scripts/install.ps1 | iexManual:
git clone https://github.com/rahulshahDEV/flutter-superpower.git ~/.flutter-superpower
~/.flutter-superpower/scripts/install.sh # install where an agent is detected
~/.flutter-superpower/scripts/install.sh --all # also create dirs for agents not yet installed
~/.flutter-superpower/scripts/install.sh --copy # copy instead of symlink
~/.flutter-superpower/scripts/install.sh --project /path/to/flutter/app # one app onlyRestart the agent session after installing — skills are discovered at session start.
| Agent | Global location(s) installed |
|---|---|
| Claude Code | ~/.claude/skills/flutter-superpower |
| opencode | ~/.config/opencode/skills/… + ~/.claude/skills/… + ~/.agents/skills/… |
| Codex | ~/.agents/skills/… + ~/.codex/skills/… |
| Gemini CLI | ~/.gemini/skills/… + ~/.agents/skills/… |
| GitHub Copilot CLI | ~/.copilot/skills/… + ~/.agents/skills/… |
| Cursor | ~/.cursor/skills/… (or project .cursor/skills/…) |
| Antigravity | ~/.gemini/antigravity/skills/… |
Project-level targets: .claude/skills, .agents/skills, .opencode/skills, .cursor/skills.
Rules that keep every harness happy:
- The skill directory must be named
flutter-superpower— the frontmatternamematches it. - Frontmatter uses only portable fields:
name,description,license,metadata.descriptionis under 1024 chars (the spec limit). - Body is plain markdown — no agent-specific syntax or tools.
Agents without skill support (older Cursor, Windsurf, plain chat): paste
templates/pointer-snippet.md into the project's AGENTS.md / CLAUDE.md, or save it as a
.cursor/rules/flutter-superpower.mdc rule.
The symlink points at the clone, so git pull updates every agent at once. No reinstall.
- Skill didn't trigger — check the symlink target, then the task wording: mention
"Flutter" + the artifact (screen/cubit/feature). Worst case, tell the agent to read
SKILL.mdfirst. - Agent skipped the house style — quote the red-flags section back at it; the fix is usually a missing REQUIRED reference (playbooks/testing/debugging).
- A reference contradicts reality — the app in front of you wins; fix the reference in
the same PR (
AGENTS.mdhas the rules).
- Version lives in three places, kept in sync:
SKILL.md→metadata.version,CHANGELOG.md, and the git tagvX.Y.Z. - Release flow: bump the three, commit, then tag and publish:
git tag -a vX.Y.Z -m "vX.Y.Z" git push origin main --tags gh release create vX.Y.Z --title "vX.Y.Z" \ --notes-file <(sed -n '/^## X.Y.Z/,/^## /p' CHANGELOG.md | sed '$d')
MIT — see LICENSE.
