loops-flutter
Skill1 starsChanged 3 months agoMITView on GitHub
Flutter/Dart implementation loop — for implementation work only. Use when the user asks to implement, build, create, add, modify, fix, or refactor any Flutter/Dart surface (screen, widget, route, state layer, service, model, localization, test, or package), or on explicit /loops-flutter.
In this repository4 other files it gives its agents.
- loops-androidSkill
- loops-nuxtSkill
- loops-react-nativeSkill
- project-flowSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
25 rules. About 0 are common, 17 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈17
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 17
Run a tight red/green loop for a single Flutter/Dart change.
- Distinctive: line 31
Do not auto-invoke for:
- Distinctive: line 38
If in doubt, prefer invoking the skill whenever the user wants code that must be written, validated, and made production-ready in a …
- Distinctive: line 42
Create a loop marker file at the start and remove it at the end.
- Distinctive: line 48
If blocked and stopping: leave the file in place, include the blocker in your final report, and tell the user to delete the marker manually …
- Distinctive: line 52
Before writing code, confirm this is a Flutter or Dart project and determine which kind:
- Very specific: line 54
Look for pubspec.yaml at the project root.
- Very specific: line 58
Read pubspec.yaml to note the package name, SDK constraints, dependencies, and any flutter: or flutter_lints: configuration.
- Very specific: line 62
If the task is being executed through project-flow, respect its approved feature implementation plan.
- Distinctive: line 64
If the project is not Flutter/Dart, stop and report that this skill is the wrong tool.
- Distinctive: line 72
If the request is ambiguous, ask a focused clarifying question rather than guessing.
- Distinctive: line 78
Prefer existing skills when they fit, but invoke only the ones relevant to the task.
- Distinctive: line 118
Do not introduce unrelated refactors.
- Very specific: line 120
When the task or failure involves Flutter/Dart framework-level behavior, consult the Dart/Flutter MCP (dart mcp-server) before assuming:
- Very specific: line 122
Use mcp_list_tools on the dart server to discover available tools.
- Very specific: line 123
Use analysis tools (analyze_files), LSP tools (lsp.*), pub.dev search (pub_dev_search), package/dependency tools (pub), formatting/fixes, …
- Distinctive: line 125
Do not call the MCP for trivial copy changes, static assets, or unrelated business logic.
- Distinctive: line 129
Run the relevant project commands in this order, stopping at the first red signal and jumping to 5.
- Distinctive: line 145
If any validation command goes red:
- Very specific: line 149
If framework-level behavior is involved (Flutter widgets, layout, routing, state management, async/gap/Isolate behavior, platform channels, …
- Very specific: line 151
Use mcp_list_tools on the dart server, then use the relevant analysis, LSP, or pub tools.
- Distinctive: line 155
Do not weaken lint rules, analyzer checks, or tests merely to make the loop pass.
- Distinctive: line 160
Keep a failure log mentally: if the same error repeats after a fix, your hypothesis was wrong.
- Distinctive: line 162
Stop looping if continuing would require a product/business decision, an external dependency, or a destructive/irreversible action.
- Distinctive: line 166
Only stop when one of these is true:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
loops-flutter — Autonomous Flutter/Dart validation loop
Run a tight red/green loop for a single Flutter/Dart change. Do not stop until the change is implemented and the relevant validation is green, or you hit a genuine blocker that requires a human decision.
Activation
This skill is the orchestration layer for implementation tasks in Flutter/Dart repositories.
Auto-invoke when all of these are true:
- The repository is a Flutter or Dart project (see 1. Detect the project shape).
- The user asks for a concrete code change using verbs such as implement, build, create, add, modify, fix, refactor, integrate, extend, wire up, or set up.
- The requested change targets a Flutter/Dart surface: screen, widget, route, layout, animation, state-management layer, service, model, JSON mapping, localization, test, CLI entrypoint, or package API.
Also invoke on explicit /loops-flutter regardless of the task wording.
Do not auto-invoke for:
- Conceptual questions ("Explain how Riverpod works.")
- Reading or summarizing files ("What does this file do?")
- Brainstorming or architecture-only discussion ("What do you think about this architecture?")
- Trivial copy/text changes unless validation is genuinely useful.
If in doubt, prefer invoking the skill whenever the user wants code that must be written, validated, and made production-ready in a Flutter/Dart repo.
Loop marker
Create a loop marker file at the start and remove it at the end. This lets agent stop-hooks prevent premature termination while the loop is running.
The default marker path is <project-root>/.agents/state/loops-flutter.active. This is the universal loop-state convention used across all loops-* skills. An agent-specific integration may enforce this state through its native lifecycle mechanism (for example, Devin's Stop hook); such mechanisms are documented under integrations/<agent>/ and are not required for the skill to function.
- At start: resolve the project root, create
.agents/state/if it does not exist, then write the marker file containing the current ISO timestamp and the task summary. - At successful end: delete the marker file.
- If blocked and stopping: leave the file in place, include the blocker in your final report, and tell the user to delete the marker manually if they want to bypass any active stop enforcement.
1. Detect the project shape
Before writing code, confirm this is a Flutter or Dart project and determine which kind:
- Look for
pubspec.yamlat the project root. - Flutter application:
pubspec.yamldeclaresflutterindependenciesplussdk: flutter, and the project contains alib/directory (often withmain.dart). - Flutter package/plugin:
pubspec.yamldeclaresflutterindependenciesand/ordev_dependencies, withsdk: flutter, plus alib/directory. A plugin also has platform directories (android/,ios/,linux/,macos/,windows/,web/). - Pure Dart package/application:
pubspec.yamlwithout a Flutter SDK dependency, withlib/and/orbin/, and Dart source files. - Read
pubspec.yamlto note the package name, SDK constraints, dependencies, and anyflutter:orflutter_lints:configuration.
Also read project instructions if they exist: AGENTS.md, CLAUDE.md, CONTRIBUTING.md, README.md, docs/plan.md, docs/handoff.md, and the target docs/features/XX-feature.md.
If the task is being executed through project-flow, respect its approved feature implementation plan. Do not bypass the human approval gate.
If the project is not Flutter/Dart, stop and report that this skill is the wrong tool.
2. Understand the change
From the user's request and conversation context:
- Identify the affected surface (screen, widget, route, layout, state layer, service, model, test, CLI, package API).
- Identify files likely to change. Use
grep/find_file_by_nameto locate related code, existing tests, and architecture conventions. - If the request is ambiguous, ask a focused clarifying question rather than guessing.
3. Plan and implement
- Build a tight validation signal first if possible: a specific test, analyzer command, or build output that will go red before the fix and green after.
- Implement the change using the project's existing patterns.
Prefer existing skills when they fit, but invoke only the ones relevant to the task. Do not mechanically call every Flutter/Dart skill.
Official Flutter skills to reach for when the task matches:
/flutter-add-integration-testfor integration testing or converting MCP-driven UI exploration into permanent tests./flutter-add-widget-previewwhen adding or updating a widget and an interactive preview would help./flutter-add-widget-testfor component-level widget tests./flutter-apply-architecture-best-practiceswhen structuring a new app or refactoring for scalability./flutter-build-responsive-layoutfor cross-form-factor layouts./flutter-fix-layout-issuesfor overflow or unbounded-constraint errors./flutter-implement-json-serializationfor manualfromJson/toJsonmodels./flutter-setup-declarative-routingforgo_routeror similar URL-based routing./flutter-setup-localizationfor addingflutter_localizations/intl/l10n.yaml./flutter-use-http-packagefor REST API calls withpackage:http.
Official Dart skills to reach for when the task matches:
/dart-add-unit-testfor unit tests on functions, methods, and classes./dart-build-cli-appfor command-line utilities and scripts./dart-collect-coveragefor coverage reports./dart-fix-runtime-errorsfor runtime stack traces and hot-reload verification./dart-generate-test-mocksformockito/build_runnermocks./dart-migrate-to-checks-packagefor migrating expectations topackage:checks./dart-resolve-package-conflictswhenpub getfails on version conflicts./dart-run-static-analysisfordart analyze/flutter analyzeanddart fix --apply./dart-setup-ffi-assetsfor Native Assets / C interop./dart-use-ffigenfor generating FFI bindings./dart-use-pattern-matchingfor switch expressions and pattern matching./dart-use-primary-constructorsfor modern constructor syntax.
General engineering skills to reach for when the task matches:
/architectfor any load-bearing design choice that is not already decided./developfor the build step when a spec exists./prototypefor a throwaway proof-of-concept./researchfor framework or API facts./tddfor test-first work./testfor writing tests after implementation./check verifyfor final acceptance verification./debugfor a clear, isolated bug./diagnosing-bugsfor a hard or non-deterministic failure./code-reviewfor a final review before declaring done.
Do not introduce unrelated refactors. Keep the change scoped.
When the task or failure involves Flutter/Dart framework-level behavior, consult the Dart/Flutter MCP (dart mcp-server) before assuming:
- Use
mcp_list_toolson thedartserver to discover available tools. - Use analysis tools (
analyze_files), LSP tools (lsp.*), pub.dev search (pub_dev_search), package/dependency tools (pub), formatting/fixes, test tools, runtime interaction, hot reload/restart, and widget/device inspection as appropriate.
Do not call the MCP for trivial copy changes, static assets, or unrelated business logic.
4. Validate the change
Run the relevant project commands in this order, stopping at the first red signal and jumping to 5. Diagnose and fix:
- Format —
dart format --set-exit-if-changed .(orflutter formaton older Flutter versions). Preferdart format. Run this first because it is fast and deterministic. - Static analysis —
dart analyzefor pure Dart packages and CLI apps;flutter analyzefor Flutter apps/packages. Use the narrowest scope first if the project supports it (e.g.,dart analyze <path>). - Relevant tests — run tests closest to the change first, then broader suites:
- Unit tests for changed files:
dart test <path>orflutter test <path>. - Widget tests for changed UI:
flutter test <widget_test_path>. - Integration tests when the change touches an end-to-end flow:
flutter test integration_test/<path>(or the project's integration-test script). - Full test command when the change is broad.
- Unit tests for changed files:
- Build —
flutter build apk,flutter build ios --no-codesign,flutter build web,dart compile exe <entrypoint>, or the project's build script when the change touches routing, build configuration, native setup, platform channels, or release behavior. For trivial layout/copy changes, build is optional but still run if cheap. - Runtime verification — for UI/runtime changes where meaningful, launch or attach to the app and use hot reload/restart, widget inspection, or the Dart/Flutter MCP runtime tools to verify the target screen/flow renders and behaves correctly. Skip this when it adds no meaningful value.
Choose the fastest command that still covers the change. Tighten the loop by running file-scoped checks before full-suite checks.
5. Diagnose and fix (red loop)
If any validation command goes red:
- Capture the exact error message, file path, and line number.
- Determine whether the failure is related to the requested change or pre-existing.
- If framework-level behavior is involved (Flutter widgets, layout, routing, state management, async/gap/Isolate behavior, platform channels, build configuration, pub dependencies):
- Consult the Dart/Flutter MCP before assuming.
- Use
mcp_list_toolson thedartserver, then use the relevant analysis, LSP, or pub tools.
- Form a falsifiable hypothesis and a minimal fix.
- Apply the fix. Prefer fixing the root cause over suppressing errors.
- Re-run the failing validation command (and any cheaper checks it depends on) before running the full suite again.
- Do not weaken lint rules, analyzer checks, or tests merely to make the loop pass.
6. Iterate safely
- Maintain a
todo_writelist so the loop is visible and scoped. - Keep a failure log mentally: if the same error repeats after a fix, your hypothesis was wrong. Re-diagnose.
- Limit: after 5 consecutive red iterations on the same root symptom, escalate to the user with what was tried and what is blocking.
- Stop looping if continuing would require a product/business decision, an external dependency, or a destructive/irreversible action.
7. Stop and report
Only stop when one of these is true:
- The change is implemented and all relevant validation passes.
- A genuine external blocker exists that cannot be resolved from the repository, tools, MCPs, documentation, or environment.
- A missing product/business decision blocks further progress.
- The next step requires destructive or irreversible human approval.
Final report (concise):
- What changed: files touched and a one-line summary.
- What was validated: the commands/checks that passed.
- Result: green / blocked.
- Remaining non-blocking warnings, if any.
If blocked:
- What is blocking progress.
- What was already tried.
- The exact human decision or missing dependency required.
Bypass and portability
- To disable any active stop enforcement for a session, delete the loop marker file (
.agents/state/loops-flutter.activeby default). - To skip the loop entirely, do not invoke
/loops-flutter; issue instructions normally. - To adjust the loop, edit the installed skill file in your agent's skills directory.
Portability note
This skill is agent-neutral. It assumes only that the agent can read files, run shell commands, search the codebase, invoke other skills, and use MCP tools if configured. Agent-specific lifecycle enforcement (such as a Stop hook) belongs in integrations/<agent>/loops-flutter/ and is optional.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

