Flutter Pub Release
MixinNetwork/flutter-plugins
Prepare and draft a pub.dev release for a package in the flutter-plugins monorepo.
VGV layered monorepo architecture in Flutter: four layers Data, Repository, Business Logic, and Presentation, unidirectional dependency rules, and model transformation across layers.
$ npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install VeryGoodOpenSource/vgv-ai-flutter-plugin layered-architecture --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/layered-architecture .claude/skills/layered-architecture && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "layered-architecture" agent skill from https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin/tree/main/skills/layered-architecture into .claude/skills/layered-architecture/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "layered-architecture", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin/tree/main/skills/layered-architectureType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install VeryGoodOpenSource/vgv-ai-flutter-plugin layered-architecture --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/layered-architecture .agents/skills/layered-architecture && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "layered-architecture" agent skill from https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin/tree/main/skills/layered-architecture into .agents/skills/layered-architecture/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "layered-architecture", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install VeryGoodOpenSource/vgv-ai-flutter-plugin layered-architecture --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/layered-architecture .cursor/skills/layered-architecture && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "layered-architecture" agent skill from https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin/tree/main/skills/layered-architecture into .cursor/skills/layered-architecture/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "layered-architecture", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin.git --path skills/layered-architecture--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install VeryGoodOpenSource/vgv-ai-flutter-plugin layered-architecture --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/layered-architecture .gemini/skills/layered-architecture && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "layered-architecture" agent skill from https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin/tree/main/skills/layered-architecture into .gemini/skills/layered-architecture/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "layered-architecture", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install VeryGoodOpenSource/vgv-ai-flutter-plugin layered-architectureInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/layered-architecture .github/skills/layered-architecture && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "layered-architecture" agent skill from https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin/tree/main/skills/layered-architecture into .github/skills/layered-architecture/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "layered-architecture", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install VeryGoodOpenSource/vgv-ai-flutter-plugin layered-architecture --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/layered-architecture .opencode/skills/layered-architecture && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "layered-architecture" agent skill from https://github.com/VeryGoodOpenSource/vgv-ai-flutter-plugin/tree/main/skills/layered-architecture into .opencode/skills/layered-architecture/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "layered-architecture", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
layered-architectureVGV layered monorepo architecture in Flutter: four layers Data, Repository, Business Logic, and Presentation, unidirectional dependency rules, and model transformation across layers.
Layered Architecture is an agent skill from VeryGoodOpenSource/vgv-ai-flutter-plugin. VGV layered monorepo architecture in Flutter: four layers Data, Repository, Business Logic, and Presentation, unidirectional dependency rules, and model transformation across layers. Use when structuring a multi-package Flutter app, creating data or repository packages, defining layer boundaries, or wiring packages in app bootstrap via path dependencies, barrel exports, and RepositoryProvider. Use too when asked to put a domain model or shared class in an apiclient or data package, or to add a cross-package…
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including reference files (for example `agents/openai.yaml`, `references/data-flow.md` and `references/model-transformation.md`).
It sits in Mobile, covering Cross-platform mobile apps, Monorepo tooling and REST APIs. It works with Flutter and Dart. The repository describes itself as: AI plugin to enhance and accelerate Flutter & Dart development, built by Very Good Ventures. The licence is MIT.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 496a3c6. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadGlobGrepmcp__very-good-cli__createmcp__very-good-cli__packages_getmcp__very-good-cli__testFrom allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are dart and yaml).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Layered Architecture loads about 4.6k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 222 tokens; SKILL.md has 1,441 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from VeryGoodOpenSource/vgv-ai-flutter-plugin at commit 496a3c6, republished under its MIT licence (© VeryGoodOpenSource). 1,441 words, ~4,614 tokens.
.claude/skills/layered-architecture/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.Layered monorepo architecture for Flutter apps — four layers organized as independent Dart packages with strict unidirectional dependencies.
Apply these standards to all layered architecture work:
packages/ — each is an independent Dart package with its own pubspec.yamllib/ — organized by feature within the appvery_good_cli MCP server create dart_package tooluser_repository, weather_repository, auth_repositorygit: or pub version references for packages in the same reposrc/ is never imported directly by consumersFirebaseAuth.instance, built in bootstrap and passed in, never constructed or defaulted inside the repositorymain_<flavor>.dart creates clients and repositories, provides them via RepositoryProviderclass const User(final String id, final String name) extends Equatable) rather than this.field; keep the classic form only below 3.13Cross-harness fallback. This skill scaffolds and tests packages via the Very Good CLI MCP server. On a host without this plugin's Bash hooks and without that MCP server connected, run the equivalent
very_good create dart_package …,very_good packages get, andvery_good testcommands directly.
| Layer | Responsibility | Location | Depends On | Example |
|---|---|---|---|---|
| Data | External communication — API calls, local storage, platform plugins | packages/<name>_api_client/ | External packages only | user_api_client, local_storage_client |
| Repository | Data orchestration — combines data sources, transforms models, caches | packages/<name>_repository/ | Zero or more data layer packages | user_repository, weather_repository |
| Business Logic | State management — processes user actions, emits state changes | lib/<feature>/bloc/ or lib/<feature>/cubit/ | Repository layer | LoginBloc, ProfileCubit |
| Presentation | UI — widgets, pages, views, layout | lib/<feature>/view/ | Business Logic layer | LoginPage, ProfileView |
┌─────────────────────────────────────────────┐
│ Presentation │
│ (lib/<feature>/view/) │
└──────────────────┬──────────────────────────┘
│ reads state / dispatches events
┌──────────────────▼──────────────────────────┐
│ Business Logic │
│ (lib/<feature>/bloc/) │
└──────────────────┬──────────────────────────┘
│ calls repository methods
┌──────────────────▼──────────────────────────┐
│ Repository │
│ (packages/<name>_repository/) │
└──────────────────┬──────────────────────────┘
│ calls data clients
┌──────────────────▼──────────────────────────┐
│ Data │
│ (packages/<name>_api_client/) │
└─────────────────────────────────────────────┘Features live in lib/, one directory each, split bloc|cubit/ and view/ with a barrel
file. Layers live in packages/, one package per data source and one per repository. The
second data package and the second repository follow the same shape as the first.
my_app/
├── lib/
│ ├── app/
│ │ ├── app.dart # Barrel file
│ │ └── view/
│ │ └── app.dart # App widget with MultiRepositoryProvider
│ ├── login/ # Feature: login
│ │ ├── login.dart # Barrel file
│ │ ├── bloc/
│ │ │ ├── login_bloc.dart
│ │ │ ├── login_event.dart
│ │ │ └── login_state.dart
│ │ └── view/
│ │ ├── login_page.dart # Page provides Bloc
│ │ └── login_view.dart # View consumes state
│ ├── profile/ # Feature: profile
│ ├── main_development.dart # Flavor entrypoint
│ ├── main_staging.dart
│ └── main_production.dart
├── packages/
│ ├── auth_api_client/ # Data layer: auth API
│ │ ├── lib/
│ │ │ ├── auth_api_client.dart # Barrel file
│ │ │ └── src/
│ │ │ ├── auth_api_client.dart
│ │ │ └── models/
│ │ │ ├── models.dart
│ │ │ └── auth_response.dart
│ │ └── pubspec.yaml
│ ├── local_storage_client/ # Data layer: local storage
│ ├── auth_repository/ # Repository layer: auth
│ │ ├── lib/
│ │ │ ├── auth_repository.dart # Barrel file
│ │ │ └── src/
│ │ │ ├── auth_repository.dart
│ │ │ └── models/
│ │ │ ├── models.dart
│ │ │ └── user.dart # Domain model
│ │ └── pubspec.yaml
│ └── user_repository/ # Repository layer: user
├── test/
│ └── ... # Mirrors lib/ structure
└── pubspec.yaml # Root app pubspecThe data layer handles all external communication. Each data package wraps a single external source (REST API, local database, platform plugin) and exposes typed methods and response models.
Rules:
very_good_cli MCP server create dart_package toolfromJson / toJson factoriessrc/Constructor-inject the HTTP client for testability. Return typed response models — never raw JSON.
/// HTTP client for the User API.
class UserApiClient {
// http.Client injected — tests pass a mock, production gets a real client
UserApiClient({
required String baseUrl,
http.Client? httpClient,
}) : _baseUrl = baseUrl,
_httpClient = httpClient ?? http.Client();
final String _baseUrl;
final http.Client _httpClient;
/// Every method returns a typed response model.
Future<UserResponse> getUser(String userId) async {
final response = await _httpClient.get(
Uri.parse('$_baseUrl/users/$userId'),
);
if (response.statusCode != 200) {
throw UserApiException(response.statusCode, response.body);
}
return UserResponse.fromJson(
json.decode(response.body) as Map<String, dynamic>,
);
}
}See worked-example.md for the complete user_api_client package with pubspec, barrel files, response models, and exception class.
The repository layer orchestrates data sources and exposes domain models. Each repository composes the data clients it needs, transforms response models into domain models, and provides a clean API for the business logic layer.
Rules:
very_good_cli MCP server create dart_package toolDomain models extend Equatable and represent the app's internal data shape — distinct from the API response shape. The repository method transforms between them.
/// Domain model — lives in the repository package, NOT the data package.
/// Fields match the app's needs, not the API schema.
class const User({
required final String id,
required final String email,
required final String displayName,
final String? avatarUrl,
}) extends Equatable {
@override
List<Object?> get props => [id, email, displayName, avatarUrl];
}/// Repository accepts data client via constructor — never creates its own.
class UserRepository {
const UserRepository({
required UserApiClient userApiClient,
}) : _userApiClient = userApiClient;
final UserApiClient _userApiClient;
/// Transforms UserResponse (API shape) → User (domain shape).
Future<User> getUser(String userId) async {
final response = await _userApiClient.getUser(userId);
return User(
id: response.id,
email: response.email,
displayName: response.displayName,
avatarUrl: response.avatarUrl,
);
}
}See worked-example.md for the complete user_repository package with pubspec, barrel files, and error handling. See model-transformation.md for detailed transformation patterns between data and domain models.
Path dependencies in each pubspec.yaml point one direction. A data package declares
external packages only. A repository package declares a path dependency on its data
packages. The root app declares its repository packages and every data package its bootstrap
constructs. main_<flavor>.dart imports each client to inject it, and
depend_on_referenced_packages in package:very_good_analysis requires every imported
package to be declared.
Imports hold the layer boundary. Once the app declares a data package, the lint no longer stops a bloc from importing it. The boundary is the import rule in Core Standards: only the app's entrypoints and bootstrap import a data package.
# packages/user_api_client/pubspec.yaml — external packages only
dependencies:
http: ^1.4.0
# packages/user_repository/pubspec.yaml — path dependency on its data package
dependencies:
user_api_client:
path: ../user_api_client
# pubspec.yaml: repositories, plus the data packages bootstrap constructs
dependencies:
user_api_client:
path: packages/user_api_client
user_repository:
path: packages/user_repositorySee references/pubspec.md for the three files in full and for checking the import boundary, including which files count as entrypoints and bootstrap.
Presentation dispatches an event → Bloc calls the repository → repository calls the data client and returns a domain model → BlocBuilder rebuilds on the new state.
See references/data-flow.md for the code at each layer.
main_<flavor>.dart imports and constructs every data client and repository, then passes
the repositories to the App widget, which exposes them through MultiRepositoryProvider.
Flavors change only configuration — base URLs, API keys — never the wiring shape.
// lib/main_development.dart
import 'package:auth_api_client/auth_api_client.dart';
import 'package:auth_repository/auth_repository.dart';
import 'package:flutter/material.dart';
import 'package:my_app/app/app.dart';
import 'package:user_api_client/user_api_client.dart';
import 'package:user_repository/user_repository.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
const baseUrl = 'https://api.dev.example.com';
// Data layer
final authApiClient = AuthApiClient(baseUrl: baseUrl);
final userApiClient = UserApiClient(baseUrl: baseUrl);
// Repository layer
final authRepository = AuthRepository(authApiClient: authApiClient);
final userRepository = UserRepository(userApiClient: userApiClient);
runApp(
App(
authRepository: authRepository,
userRepository: userRepository,
),
);
}See references/worked-example.md for the full main() and
the App widget with MultiRepositoryProvider.
| Anti-Pattern | Problem | Correct Approach |
|---|---|---|
| Widget calls API client directly | Bypasses Repository and Business Logic layers — no transformation, no state management | Widget dispatches event → Bloc calls Repository → Repository calls API client |
| Repository imports another repository | Creates circular or tangled dependency graphs — breaks independent testability | Each repository is self-contained; combine data at the Bloc level if needed |
| Domain models in data layer | Couples external API shape to internal domain — API changes break the entire app | Data layer has response models; Repository layer has domain models with transformation |
| Business logic in repository | Repository becomes untestable monolith mixing orchestration with rules | Repository transforms data; Bloc/Cubit contains all business rules |
git: or pub version for local packages | Breaks monorepo — changes require publish/push cycles instead of instant local edits | Use path: dependencies for all packages within the monorepo |
| Flutter imports in data/repository packages | Prevents packages from being used in Dart-only contexts (CLI tools, servers) | Scaffold with the very_good_cli MCP server create dart_package tool — no Flutter SDK dependency |
| One giant repository for everything | God-object with too many responsibilities — impossible to test in isolation | One repository per domain boundary (user_repository, settings_repository) |
Importing src/ directly | Breaks encapsulation — consumers depend on internal structure | Export public API through barrel files; import the package, never src/ paths |
very_good_cli MCP server create dart_package tool: <name>_api_client --output-directory packagespubspec.yaml (e.g., http, json_annotation)lib/src/models/ with fromJson/toJsonlib/src/models/models.dart exporting all modelslib/src/<name>_api_client.dartlib/<name>_api_client.dart exporting src/ contentstest/ mirroring lib/ structure — see the testing skillvery_good_cli MCP server tool test against the package directory — pass directory: 'packages/<name>_api_client' to scope the runvery_good_cli MCP server create dart_package tool: <name>_repository --output-directory packagespubspec.yamlequatable to dependencies for domain modelslib/src/models/ extending Equatablelib/src/models/models.dartlib/<name>_repository.dartpubspec.yamlmain_<flavor>.dart and pass the repository to AppRepositoryProvider.value in App's MultiRepositoryProviderBlocProvider and BlocBuilder — see the bloc skilllib/ and test/ for package:<data_package>/ imports. The work is done when every hit is an entrypoint or bootstrap file, as the pubspec reference's Import Boundary section defines themvery_good_cli MCP server create dart_package tool© VeryGoodOpenSource, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (references) in skills/layered-architecture of VeryGoodOpenSource/vgv-ai-flutter-plugin.
Open the folder on GitHubat commit 496a3c6
Layered Architecture next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Layered Architecture this skillVeryGoodOpenSource/vgv-ai-flutter-plugin | 169 | — | ~4.6k | Automated safety check: Pass | MIT | |
| Flutter Pub ReleaseMixinNetwork/flutter-plugins | 512 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Code Guidelinesgetsentry/sentry-dart | 873 | — | ~2.2k | Automated safety check: Pass | MIT | |
| NpgsqlrestNpgsqlRest/NpgsqlRest | 132 | — | ~7k | Automated safety check: Notes | MIT | |
| Flutter Use HTTP Packageabdulmominsakib/localmind | 261 | 1 repos | ~1.6k | Automated safety check: Pass | MIT | |
| Test Guidelinesgetsentry/sentry-dart | 873 | — | ~3.1k | Automated safety check: Pass | MIT |
MixinNetwork/flutter-plugins
Prepare and draft a pub.dev release for a package in the flutter-plugins monorepo.
getsentry/sentry-dart
Enforce Sentry Dart/Flutter SDK code guidelines for implementation, refactoring, and review.
NpgsqlRest/NpgsqlRest
Build and modify REST APIs with NpgsqlRest — exposing PostgreSQL as HTTP endpoints from two sources (database functions/procedures/tables/views, and plain .sql files), driven by SQL comment…
abdulmominsakib/localmind
Use the http package to execute GET, POST, PUT, or DELETE requests.
getsentry/sentry-dart
Enforce Sentry Dart/Flutter SDK test conventions for naming, structure, and fixtures.
sesori-ai/sesori_apps_monorepo
Weekly dependency update workflow for Sesori Apps Monorepo. An agent skill from sesori-ai/sesori_apps_monorepo.
VeryGoodOpenSource/vgv-ai-flutter-plugin
Audits or remediates Flutter widgets against WCAG 2.2 conformance levels A, AA, or AAA across iOS, Android, Web, macOS, Windows, and Linux, covering Semantics labels and screen reader output under…
VeryGoodOpenSource/vgv-ai-flutter-plugin
Best practices for Flutter animations using the built-in animation framework, covering implicit animations, explicit AnimationController animations, page transitions, and Material 3 motion tokens.
VeryGoodOpenSource/vgv-ai-flutter-plugin
Best practices for Bloc state management in Flutter/Dart, covering Cubit versus Bloc, event and state naming, sealed classes with Equatable, the Page/View split with BlocProvider, BlocBuilder…
VeryGoodOpenSource/vgv-ai-flutter-plugin
VGV-specific reference for bumping Dart and Flutter SDK constraints across packages, covering pubspec.yaml environment constraints, CI workflow Flutter versions, and SDK upgrade PR preparation.
VeryGoodOpenSource/vgv-ai-flutter-plugin
Best practices for internationalization (i18n) and localization (l10n) in Flutter, using the built-in flutterlocalizations and intl setup with ARB files as the single source of truth.
VeryGoodOpenSource/vgv-ai-flutter-plugin
Best practices for Flutter theming with Material 3, treating ThemeData as the single source of truth for colors, typography, component styles, and spacing.
Categories
VGV layered monorepo architecture in Flutter: four layers Data, Repository, Business Logic, and Presentation, unidirectional dependency rules, and model transformation across layers. Layered Architecture is an agent skill from VeryGoodOpenSource/vgv-ai-flutter-plugin. VGV layered monorepo architecture in Flutter: four layers Data, Repository, Business Logic, and Presentation, unidirectional dependency rules, and model transformation across layers.
Layered Architecture fits situations like: structuring a multi-package Flutter app; repository packages; defining layer boundaries; wiring packages in app bootstrap via path dependencies.
Run `npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a claude-code`. Or copy the skill folder (skills/layered-architecture in VeryGoodOpenSource/vgv-ai-flutter-plugin) into .claude/skills/layered-architecture in your project. Claude Code loads it when a task matches its description.
Run `npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a codex`. Or copy the skill folder (skills/layered-architecture in VeryGoodOpenSource/vgv-ai-flutter-plugin) into .agents/skills/layered-architecture in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/layered-architecture, .gemini/skills/layered-architecture, .github/skills/layered-architecture and .opencode/skills/layered-architecture in your project.
SKILL.md names no scripts, command-line tools or credentials: Layered Architecture is instructions for the agent only. Its frontmatter pre-approves these tools: Read, Glob, Grep, mcp__very-good-cli__create, mcp__very-good-cli__packages_get, mcp__very-good-cli__test.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Layered Architecture is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Layered Architecture: Flutter Pub Release (MixinNetwork/flutter-plugins, 512 stars), Code Guidelines (getsentry/sentry-dart, 873 stars), Npgsqlrest (NpgsqlRest/NpgsqlRest, 132 stars) and Flutter Use HTTP Package (abdulmominsakib/localmind, 261 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
VeryGoodOpenSource (a GitHub organization) maintains it in VeryGoodOpenSource/vgv-ai-flutter-plugin, which has 169 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 6, 2026.
Source: VeryGoodOpenSource/vgv-ai-flutter-plugin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.