VGV layered monorepo architecture in Flutter: four layers Data, Repository, Business Logic, and Presentation, unidirectional dependency rules, and model transformation across layers.

MITAuto-check passedMobile

Install Layered Architecture

skills CLI
$ npx skills add VeryGoodOpenSource/vgv-ai-flutter-plugin --skill layered-architecture -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install VeryGoodOpenSource/vgv-ai-flutter-plugin layered-architecture --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
layered-architecture
GitHub stars
169
Token cost
~4.6k tokens
SKILL.md length
1,441 words
Files
7 (incl. references)
Skills in repo
15
Repo updated
First seen
Licence
MIT

At a glance

VGV layered monorepo architecture in Flutter: four layers Data, Repository, Business Logic, and Presentation, unidirectional dependency rules, and model transformation across layers.

  • Works in 8 steps: Scaffold the package with the… → Add external dependencies to… → Create response models in… → …
  • Structuring a multi-package Flutter app
  • SKILL.md covers Core Standards, Architecture Overview, Monorepo Structure and Data Layer, plus 7 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

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.

When your agent uses it

  • Structuring a multi-package Flutter app
  • Repository packages
  • Defining layer boundaries
  • Wiring packages in app bootstrap via path dependencies

Example prompts

  • “m starting a weather app that reads from a REST API”
  • “/layered-architecture”

Requirements

  • Pre-approved tools (allowed-tools): Read, Glob, Grep, mcp__very-good-cli__create, mcp__very-good-cli__packages_get, mcp__very-good-cli__test

Workflow steps

8 steps, taken from the first numbered list in SKILL.md.

  1. Scaffold the package with the very_good_cli MCP server create dart_package tool: _api_client --output-directory packages
  2. Add external dependencies to pubspec.yaml (e.g., http, json_annotation)
  3. Create response models in lib/src/models/ with fromJson/toJson
  4. Create barrel file lib/src/models/models.dart exporting all models
  5. Implement the client class in lib/src/_api_client.dart
  6. Create the package barrel file lib/_api_client.dart exporting src/ contents
  7. Write unit tests in test/ mirroring lib/ structure — see the testing skill
  8. Use very_good_cli MCP server tool test against the package directory — pass directory: 'packages/_api_client' to scope the run

What it can do on your machine

Read from SKILL.md and the folder at commit 496a3c6. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Glob
    • Grep
    • mcp__very-good-cli__create
    • mcp__very-good-cli__packages_get
    • mcp__very-good-cli__test

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    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.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~222
When it runs · the whole SKILL.md, loaded when a task matches
~4.6k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~12k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from VeryGoodOpenSource/vgv-ai-flutter-plugin at commit 496a3c6, republished under its MIT licence (© VeryGoodOpenSource). 1,441 words, ~4,614 tokens.

Download SKILL.mdSave it as .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.
name
layered-architecture
description
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 api_client or data package, or to add a cross-package dependency the layers forbid. Also use for a new app described in one line ("I'm starting a weather app that reads from a REST API") plus a request for the package, project, folder, or directory layout, or for where a file or feature should live and which package code belongs in. Applies even when the user never says monorepo, layer, or architecture.
allowed-tools
Read, Glob, Grep, mcp__very-good-cli__create, mcp__very-good-cli__packages_get, mcp__very-good-cli__test
effort
high

Layered Architecture

Layered monorepo architecture for Flutter apps — four layers organized as independent Dart packages with strict unidirectional dependencies.


Core Standards

Apply these standards to all layered architecture work:

  • Four layers — Data, Repository, Business Logic, Presentation — a feature spans all four whenever its repository reads an external source
  • Unidirectional dependencies — Presentation → Business Logic → Repository → Data — never skip or invert a layer
  • Data and Repository layers live in packages/ — each is an independent Dart package with its own pubspec.yaml
  • Business Logic and Presentation live in lib/ — organized by feature within the app
  • Data layer packages contain zero domain/business logic — they must be reusable in unrelated projects
  • No inter-repository dependencies — repositories never import other repositories
  • No Flutter SDK in data or repository packages — scaffold with the very_good_cli MCP server create dart_package tool
  • One repository per domain — user_repository, weather_repository, auth_repository
  • Path dependencies for local packages — never git: or pub version references for packages in the same repo
  • Barrel exports at every package boundary — src/ is never imported directly by consumers
  • Repositories take every external source through the constructor — a data client or an SDK object such as FirebaseAuth.instance, built in bootstrap and passed in, never constructed or defaulted inside the repository
  • App bootstrap wires all layers — main_<flavor>.dart creates clients and repositories, provides them via RepositoryProvider
  • Only the app's entrypoints and bootstrap import a data package — blocs, widgets, and app tests reach data through a repository
  • Dart 3.13 primary constructors — on a Dart 3.13+ baseline, declare model and widget fields as primary-constructor declaring parameters (class const User(final String id, final String name) extends Equatable) rather than this.field; keep the classic form only below 3.13

Cross-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, and very_good test commands directly.

Architecture Overview

LayerResponsibilityLocationDepends OnExample
DataExternal communication — API calls, local storage, platform pluginspackages/<name>_api_client/External packages onlyuser_api_client, local_storage_client
RepositoryData orchestration — combines data sources, transforms models, cachespackages/<name>_repository/Zero or more data layer packagesuser_repository, weather_repository
Business LogicState management — processes user actions, emits state changeslib/<feature>/bloc/ or lib/<feature>/cubit/Repository layerLoginBloc, ProfileCubit
PresentationUI — widgets, pages, views, layoutlib/<feature>/view/Business Logic layerLoginPage, ProfileView
text
┌─────────────────────────────────────────────┐
│              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/)           │
└─────────────────────────────────────────────┘

Monorepo Structure

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.

text
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 pubspec

Data Layer

The 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:

  • Models represent the external data shape — match the API/storage schema exactly
  • No Flutter imports — use the very_good_cli MCP server create dart_package tool
  • Constructor-inject HTTP clients for testability
  • Response models use fromJson / toJson factories
  • Export everything through a barrel file — never expose src/
Pattern: Data Client Class

Constructor-inject the HTTP client for testability. Return typed response models — never raw JSON.

dart
/// 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.

Repository Layer

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:

  • No inter-repository dependencies — repositories are isolated
  • No Flutter SDK — the very_good_cli MCP server create dart_package tool
  • Domain models live in the repository package — not in data packages
  • Transform data models into domain models — never leak API response shapes upstream
  • A repository with no external source, such as in-memory session state, takes no constructor arguments
Pattern: Domain Model + Repository Transformation

Domain models extend Equatable and represent the app's internal data shape — distinct from the API response shape. The repository method transforms between them.

dart
/// 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];
}
dart
/// 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.

Dependency Graph

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.

yaml
# 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_repository

See references/pubspec.md for the three files in full and for checking the import boundary, including which files count as entrypoints and bootstrap.

Data Flow

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.

App Bootstrap

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.

dart
// 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.

Show full SKILL.md (558 more words)Show less

Anti-Patterns

Anti-PatternProblemCorrect Approach
Widget calls API client directlyBypasses Repository and Business Logic layers — no transformation, no state managementWidget dispatches event → Bloc calls Repository → Repository calls API client
Repository imports another repositoryCreates circular or tangled dependency graphs — breaks independent testabilityEach repository is self-contained; combine data at the Bloc level if needed
Domain models in data layerCouples external API shape to internal domain — API changes break the entire appData layer has response models; Repository layer has domain models with transformation
Business logic in repositoryRepository becomes untestable monolith mixing orchestration with rulesRepository transforms data; Bloc/Cubit contains all business rules
git: or pub version for local packagesBreaks monorepo — changes require publish/push cycles instead of instant local editsUse path: dependencies for all packages within the monorepo
Flutter imports in data/repository packagesPrevents 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 everythingGod-object with too many responsibilities — impossible to test in isolationOne repository per domain boundary (user_repository, settings_repository)
Importing src/ directlyBreaks encapsulation — consumers depend on internal structureExport public API through barrel files; import the package, never src/ paths

Common Workflows

Adding a New Data Source
  1. Scaffold the package with the very_good_cli MCP server create dart_package tool: <name>_api_client --output-directory packages
  2. Add external dependencies to pubspec.yaml (e.g., http, json_annotation)
  3. Create response models in lib/src/models/ with fromJson/toJson
  4. Create barrel file lib/src/models/models.dart exporting all models
  5. Implement the client class in lib/src/<name>_api_client.dart
  6. Create the package barrel file lib/<name>_api_client.dart exporting src/ contents
  7. Write unit tests in test/ mirroring lib/ structure — see the testing skill
  8. Use very_good_cli MCP server tool test against the package directory — pass directory: 'packages/<name>_api_client' to scope the run
Adding a New Repository
  1. Scaffold the package with the very_good_cli MCP server create dart_package tool: <name>_repository --output-directory packages
  2. Add path dependencies to data layer packages in pubspec.yaml
  3. Add equatable to dependencies for domain models
  4. Create domain models in lib/src/models/ extending Equatable
  5. Create barrel file lib/src/models/models.dart
  6. Implement the repository class with constructor-injected data clients
  7. Add transformation logic from response models to domain models
  8. Create the package barrel file lib/<name>_repository.dart
  9. Write unit tests with mocked data clients — see the testing skill
Connecting a Repository to a Feature
  1. Add path dependencies on the repository package and on each data package it takes to root pubspec.yaml
  2. Create the data clients and the repository in main_<flavor>.dart and pass the repository to App
  3. Add RepositoryProvider.value in App's MultiRepositoryProvider
  4. Create the Bloc/Cubit with the repository injected — see the bloc skill
  5. Build the Page/View with BlocProvider and BlocBuilder — see the bloc skill
  6. Grep lib/ 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 them

Additional Resources

© VeryGoodOpenSource, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 6 other files (references) in skills/layered-architecture of VeryGoodOpenSource/vgv-ai-flutter-plugin.

  • SKILL.md
  • agents/openai.yaml
  • references/data-flow.md
  • references/model-transformation.md
  • references/pubspec.md
  • references/testing.md
  • references/worked-example.md

Open the folder on GitHubat commit 496a3c6

Compare with similar skills

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.

Layered Architecture compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Layered Architecture this skillVeryGoodOpenSource/vgv-ai-flutter-plugin169—~4.6kAutomated safety check: PassMIT
Flutter Pub ReleaseMixinNetwork/flutter-plugins512—~1.3kAutomated safety check: PassMIT
Code Guidelinesgetsentry/sentry-dart873—~2.2kAutomated safety check: PassMIT
NpgsqlrestNpgsqlRest/NpgsqlRest132—~7kAutomated safety check: NotesMIT
Flutter Use HTTP Packageabdulmominsakib/localmind2611 repos~1.6kAutomated safety check: PassMIT
Test Guidelinesgetsentry/sentry-dart873—~3.1kAutomated safety check: PassMIT

Similar skills

  • Flutter Pub Release

    MixinNetwork/flutter-plugins

    Prepare and draft a pub.dev release for a package in the flutter-plugins monorepo.

    512 GitHub stars~1.3k tokensUpdated 1 mo ago
    MobileAuto-check passed
  • Code Guidelines

    getsentry/sentry-dart

    Official

    Enforce Sentry Dart/Flutter SDK code guidelines for implementation, refactoring, and review.

    873 GitHub stars~2.2k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Npgsqlrest

    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…

    132 GitHub stars~7k tokensUpdated 5 days ago
    DatabasesAuto-check: notes
  • Flutter Use HTTP Package

    abdulmominsakib/localmind

    Use the http package to execute GET, POST, PUT, or DELETE requests.

    261 GitHub starsUsed in 1 repo~1.6k tokens
    MobileAuto-check passed
  • Test Guidelines

    getsentry/sentry-dart

    Official

    Enforce Sentry Dart/Flutter SDK test conventions for naming, structure, and fixtures.

    873 GitHub stars~3.1k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Update Dependencies

    sesori-ai/sesori_apps_monorepo

    Weekly dependency update workflow for Sesori Apps Monorepo. An agent skill from sesori-ai/sesori_apps_monorepo.

    126 GitHub stars~7.8k tokensUpdated today
    DevelopmentAuto-check passed

More from VeryGoodOpenSource/vgv-ai-flutter-plugin

All 15 skills in this repo
  • Accessibility

    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…

    169 GitHub stars~4.2k tokensUpdated 2 days ago
    Auto-check passed
  • Animations

    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.

    169 GitHub stars~3.5k tokensUpdated 2 days ago
    Auto-check passed
  • Bloc

    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…

    169 GitHub stars~2k tokensUpdated 2 days ago
    Auto-check passed
  • Dart Flutter SDK Upgrade

    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.

    169 GitHub stars~2.6k tokensUpdated 2 days ago
    Auto-check: notes
  • Internationalization

    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.

    169 GitHub stars~1.6k tokensUpdated 2 days ago
    Auto-check passed
  • Material Theming

    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.

    169 GitHub stars~2.3k tokensUpdated 2 days ago
    Auto-check passed

Works with

Questions about Layered Architecture

What does Layered Architecture do?

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.

When should I use Layered Architecture?

Layered Architecture fits situations like: structuring a multi-package Flutter app; repository packages; defining layer boundaries; wiring packages in app bootstrap via path dependencies.

How do I install Layered Architecture in Claude Code?

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.

How do I install Layered Architecture in Codex?

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.

Can I use Layered Architecture in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Layered Architecture need to run?

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.

Does Layered Architecture access the network?

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.

Is Layered Architecture safe to install?

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.

What licence does Layered Architecture use?

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.

How many tokens does Layered Architecture use?

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.

What are the alternatives to Layered Architecture?

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.

Who maintains Layered Architecture?

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.