Code Review
flutter/flutter
Performs a comprehensive, multi-step code review of pull requests or local code changes, using iterative refinement (generation, critique, synthesis) to ensure high-quality, actionable feedback.
How to create domain entities, data models, and repositories in the Unyo Flutter app.
$ npx skills add K3vinb5/unyo-app --skill unyo-domain-data-layer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install K3vinb5/unyo-app unyo-domain-data-layer --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/K3vinb5/unyo-app.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/unyo-domain-data-layer .claude/skills/unyo-domain-data-layer && 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 "unyo-domain-data-layer" agent skill from https://github.com/K3vinb5/unyo-app/tree/rewrite/.agents/skills/unyo-domain-data-layer into .claude/skills/unyo-domain-data-layer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unyo-domain-data-layer", 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/K3vinb5/unyo-app/tree/rewrite/.agents/skills/unyo-domain-data-layerType 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 K3vinb5/unyo-app --skill unyo-domain-data-layer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install K3vinb5/unyo-app unyo-domain-data-layer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/K3vinb5/unyo-app.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/unyo-domain-data-layer .agents/skills/unyo-domain-data-layer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "unyo-domain-data-layer" agent skill from https://github.com/K3vinb5/unyo-app/tree/rewrite/.agents/skills/unyo-domain-data-layer into .agents/skills/unyo-domain-data-layer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unyo-domain-data-layer", 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 K3vinb5/unyo-app --skill unyo-domain-data-layer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install K3vinb5/unyo-app unyo-domain-data-layer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/K3vinb5/unyo-app.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/unyo-domain-data-layer .cursor/skills/unyo-domain-data-layer && 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 "unyo-domain-data-layer" agent skill from https://github.com/K3vinb5/unyo-app/tree/rewrite/.agents/skills/unyo-domain-data-layer into .cursor/skills/unyo-domain-data-layer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unyo-domain-data-layer", 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/K3vinb5/unyo-app.git --path .agents/skills/unyo-domain-data-layer--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 K3vinb5/unyo-app --skill unyo-domain-data-layer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install K3vinb5/unyo-app unyo-domain-data-layer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/K3vinb5/unyo-app.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/unyo-domain-data-layer .gemini/skills/unyo-domain-data-layer && 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 "unyo-domain-data-layer" agent skill from https://github.com/K3vinb5/unyo-app/tree/rewrite/.agents/skills/unyo-domain-data-layer into .gemini/skills/unyo-domain-data-layer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unyo-domain-data-layer", 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 K3vinb5/unyo-app unyo-domain-data-layerInstalls 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 K3vinb5/unyo-app --skill unyo-domain-data-layer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/K3vinb5/unyo-app.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/unyo-domain-data-layer .github/skills/unyo-domain-data-layer && 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 "unyo-domain-data-layer" agent skill from https://github.com/K3vinb5/unyo-app/tree/rewrite/.agents/skills/unyo-domain-data-layer into .github/skills/unyo-domain-data-layer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unyo-domain-data-layer", 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 K3vinb5/unyo-app --skill unyo-domain-data-layer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install K3vinb5/unyo-app unyo-domain-data-layer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/K3vinb5/unyo-app.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/unyo-domain-data-layer .opencode/skills/unyo-domain-data-layer && 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 "unyo-domain-data-layer" agent skill from https://github.com/K3vinb5/unyo-app/tree/rewrite/.agents/skills/unyo-domain-data-layer into .opencode/skills/unyo-domain-data-layer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unyo-domain-data-layer", 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.
unyo-domain-data-layerHow to create domain entities, data models, and repositories in the Unyo Flutter app.
Unyo Domain Data Layer is an agent skill from K3vinb5/unyo-app. How to create domain entities, data models, and repositories in the Unyo Flutter app. Use this skill whenever adding new data types, creating repository interfaces or implementations, defining Freezed models, setting up Hive adapters, or mapping API responses to domain objects in the Unyo codebase. Also use when modifying existing entities, models, or data fetching logic.
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development. It works with Flutter. The repository describes itself as: 🐙 Anime streaming and Manga reader desktop app without ads. The licence is BSD-3-Clause.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 0a44722. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
flutterFrom 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.
Unyo Domain Data Layer loads about 2.9k tokens when it runs. Until then it costs about 99 tokens; SKILL.md has 715 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 K3vinb5/unyo-app at commit 0a44722, republished under its BSD-3-Clause licence (© K3vinb5). 715 words, ~2,871 tokens.
.claude/skills/unyo-domain-data-layer/SKILL.md (or your agent's skills folder).This skill covers the domain/data architecture in Unyo: entities, models, and repositories. Everything starts here — before you add a cubit, screen, or notifier, you need the domain and data layer in place.
lib/
├── domain/
│ ├── entities/ # Abstract business objects
│ │ ├── anime.dart # Abstract class + Freezed implementation
│ │ └── entities.dart # Barrel export
│ └── repositories/ # Abstract repository contracts
│ ├── anime_repository.dart
│ └── repositories.dart # Barrel export
├── data/
│ ├── models/ # Concrete Freezed models with JSON mapping
│ │ ├── anilist_anime_model.dart
│ │ └── models.dart # Barrel export
│ ├── repositories/ # Repository implementations
│ │ ├── anime_repository_anilist.dart
│ │ ├── repository_mixin.dart
│ │ └── repositories.dart # Barrel export
│ └── adapters/ # Hive type adapters
├── generated/json/ # Generated JSON serialization code
└── core/services/api/ # API services and DTOs
├── graphql/ # GraphQL service, queries, responses
├── http/ # HTTP service, responses, exceptions
└── dto/ # Data Transfer Objects (API response models)Domain entities live in lib/domain/entities/. They use a dual-class pattern: an abstract base class defining the contract, and a Freezed-generated implementation class.
Why two classes? The abstract class lets repositories return a stable domain type while data models can vary by provider (AniList, MAL, etc.). The Freezed class gets copyWith, equality, and JSON serialization for free.
// lib/domain/entities/anime.dart
import 'package:freezed_annotation/freezed_annotation.dart';
import 'airing_episode.dart';
import 'title.dart';
part 'anime.freezed.dart';
part 'anime.g.dart';
// Abstract base — the domain contract
abstract class Anime {
final int id;
final String coverImage;
// ... all fields as final
const Anime({
required this.id,
required this.coverImage,
// ... all required parameters
});
}
// Freezed implementation — adds copyWith, equality, JSON
@freezed
abstract class AnimeModel with _$AnimeModel implements Anime {
const factory AnimeModel({
required int id,
@TitleConverter() required Title title,
required String coverImage,
// ... all fields matching the abstract class
}) = _AnimeModel;
// Factory for empty/default instances (used in initial state)
factory AnimeModel.empty() => AnimeModel(
id: -1,
title: TitleModel.empty(),
coverImage: '',
);
// JSON serialization
factory AnimeModel.fromJson(Map<String, dynamic> json) =>
_$AnimeModelFromJson(json);
// Required for toJson on the abstract type
@override
Map<String, dynamic> toJson() =>
_$AnimeModelToJson(this as _AnimeModel);
}
// Converter for use in other Freezed classes that reference this type
class AnimeConverter
implements JsonConverter<Anime, Map<String, dynamic>> {
const AnimeConverter();
@override
Anime fromJson(Map<String, dynamic> json) =>
AnimeModel.fromJson(json);
@override
Map<String, dynamic> toJson(Anime object) =>
(object as AnimeModel).toJson();
}Always pair abstract + Freezed — never use Freezed alone for a domain entity that other code references. Other code should depend on the abstract class, not the model.
Custom JSON converters are needed when a Freezed class references another abstract entity type. The converter delegates to the concrete model's fromJson/toJson. Name them <EntityName>Converter.
Empty factories are essential — cubit initial states need default values. Every entity should have an .empty() factory.
Add the entity to the barrel export in lib/domain/entities/entities.dart.
Run code generation after creating or modifying any entity:
flutter pub run build_runner build --delete-conflicting-outputsData models in lib/data/models/ extend domain entities by adding factory constructors that map from API response DTOs.
implements Anime (the abstract class), NOT extends AnimefromScheduleEntry(), fromPopularOrTrendingMediaEntry() map specific API responsespart 'model_name.freezed.dart' and part 'model_name.g.dart'// lib/data/models/anilist_anime_model.dart
@freezed
abstract class AnilistAnimeModel with _$AnilistAnimeModel implements Anime {
const AnilistAnimeModel._(); // Private constructor for custom methods
const factory AnilistAnimeModel({
required int id,
required String coverImage,
// ... all fields from Anime abstract class
}) = _AnilistAnimeModel;
// Map from AniList API DTO
factory AnilistAnimeModel.fromScheduleEntry(
MediaCollectionRecentlyReleasedDto schedule) {
return AnilistAnimeModel(
id: schedule.media.id,
coverImage: schedule.media.coverImage.large,
// ... map all fields
);
}
factory AnilistAnimeModel.fromJson(Map<String, dynamic> json) =>
_$AnilistAnimeModelFromJson(json);
}Important: When there are multiple API sources (AniList, MAL, etc.), each source gets its own model file (e.g., mal_anime_model.dart) but they all implement the same Anime abstract class.
Repositories follow a strict interface-implementation separation:
// lib/domain/repositories/anime_repository.dart
abstract class AnimeRepository {
Future<(bool, List<Anime>)> getTrendingAnimes(int page, User loggedUser);
Future<(bool, AnimeDetails)> getAnimeDetails(Anime selectedAnime, User loggedUser);
// ... all methods as abstract
}Convention: Methods return Dart records (bool, List<Anime>) where the bool indicates if there's a next page. Methods take User typed parameters (the abstract User, not AnilistUserModel).
// lib/data/repositories/anime_repository_anilist.dart
class AnimeRepositoryAnilist with RepositoryMixin implements AnimeRepository {
final GraphQLService _anilistGraphQLService = sl<GraphQLService>(
instanceName: config.anilistGraphQlService,
);
final Logger _logger = sl<Logger>();
@override
Future<(bool, List<Anime>)> getTrendingAnimes(int page, User loggedUser) async {
// 1. Call the API service
final response = await _anilistGraphQLService.query(
query: anilist_queries.mediaTrendingOrPopularQuery,
fromJson: MediaCollectionTrendingOrPopularGraphqlEntity.fromJson,
variables: {"sort": "TRENDING_DESC", "page": page, "perPage": 30, "type": "ANIME"},
);
// 2. Use RepositoryMixin to check for errors
throwIfGraphQlError(response);
// 3. Map DTOs to domain models
final animes = response.data.page.media
.map((entry) => AnilistAnimeModel.fromPopularOrTrendingMediaEntry(entry))
.toList();
return (true, animes);
}
}Key patterns:
RepositoryMixin.throwIfGraphQlError() to check for API errors — this throws a GraphQLException that cubits catchAnimeRepositoryAnilist, AnimeRepositoryMal, etc.sl<T>() (service locator), not constructor params (repositories are singletons)// lib/domain/repositories/repositories.dart
export 'anime_repository.dart';
// lib/data/repositories/repositories.dart
export 'anime_repository_anilist.dart';API response DTOs live in lib/core/services/api/dto/. They are generated from JSON using json_serializable:
// lib/core/services/api/dto/anilist/media_collection_trendingOrPopular_graphql_entity.dart
// These are typically auto-generated or manually created from the API schema
// They use json_annotation and have corresponding .g.dart filesConvention: DTO class names describe the API response structure (e.g., MediaCollectionTrendingOrPopularGraphqlEntity). They are internal to the data layer and never leak into domain or application code.
For entities that need local persistence via Hive:
@HiveType(typeId: N) annotationslib/data/adapters/ handles serializationmain.dart via Hive.registerAdapter() or Hive.registerAdapters() (auto-generated)When adding a completely new feature (e.g., "Studio browsing"):
lib/domain/entities/studio.dart with abstract class + Freezed model + converterlib/domain/entities/entities.dartlib/data/models/anilist_studio_model.dart with mapping factorieslib/domain/repositories/studio_repository.dartlib/data/repositories/studio_repository_anilist.dart using RepositoryMixinlib/core/services/api/dto/anilist/lib/core/services/api/graphql/queries/anilist_queries.dartlib/core/di/locator.dart (see unyo-dependency-injection skill)flutter pub run build_runner build --delete-conflicting-outputsflutter analyzepart directives: Every entity/model file needs part 'filename.freezed.dart' and part 'filename.g.dart' (if using JSON).BConverter. Without it, Freezed generates code that tries to serialize the abstract type directly.@freezed, @JsonSerializable, or @HiveType annotated files, you must regenerate.unyo-dependency-injection skillunyo-bloc-state-management skillunyo-reactive-notifiers skill© K3vinb5, BSD-3-Clause. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/unyo-domain-data-layer of K3vinb5/unyo-app.
Open the folder on GitHubat commit 0a44722
Unyo Domain Data Layer 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 |
|---|---|---|---|---|---|---|
| Unyo Domain Data Layer this skillK3vinb5/unyo-app | 664 | — | ~2.9k | Automated safety check: Pass | BSD-3-Clause | |
| Code Reviewflutter/flutter | 179k | — | ~1.4k | Automated safety check: Pass | BSD-3-Clause | |
| Senior Architect Toolkitmaslennikov-ig/claude-code-orchestrator-kit | 260 | 8 repos | ~1.2k | Automated safety check: Notes | Custom licence | |
| Code Review Skillawesome-skills/code-review-skill | 2.1k | — | ~2.8k | Automated safety check: Notes | MIT | |
| Adding Release Notesflutter/devtools | 1.7k | — | ~1k | Automated safety check: Pass | BSD-3-Clause | |
| Code Guidelinesgetsentry/sentry-dart | 873 | — | ~2.2k | Automated safety check: Pass | MIT |
flutter/flutter
Performs a comprehensive, multi-step code review of pull requests or local code changes, using iterative refinement (generation, critique, synthesis) to ensure high-quality, actionable feedback.
maslennikov-ig/claude-code-orchestrator-kit
Comprehensive software architecture skill for designing scalable, maintainable systems using ReactJS, NextJS, NodeJS, Express, React Native, Swift, Kotlin…
awesome-skills/code-review-skill
Provides comprehensive code review guidance for React 19, Vue 3, Angular 17+, Svelte 5, Rust, TypeScript, Java, Java 8, PHP, Ruby, Rails, Python, Django, FastAPI, Go, C/.NET, Kotlin, Swift, Dart…
flutter/devtools
Adds user-facing change descriptions to DevTools release notes.
getsentry/sentry-dart
Enforce Sentry Dart/Flutter SDK code guidelines for implementation, refactoring, and review.
k8zdev/k8z
Automate git worktree creation and copy private files (not tracked in git) to new workdirs.
K3vinb5/unyo-app
Generate Dart bean classes from JSON and regenerate serialization helpers using the fjson CLI.
K3vinb5/unyo-app
How to create cubits, define states, use the EffectMixin pattern, and handle side effects in the Unyo Flutter app.
K3vinb5/unyo-app
How to register and resolve dependencies using GetIt in the Unyo Flutter app.
K3vinb5/unyo-app
How to create and use RxDart BehaviorSubject notifiers for cross-cubit communication in the Unyo Flutter app.
K3vinb5/unyo-app
How to add routes, configure navigation, and use AutoRoute in the Unyo Flutter app.
K3vinb5/unyo-app
How to build screens, widgets, and handle effects in the Unyo Flutter app's presentation layer.
Works with
Categories
How to create domain entities, data models, and repositories in the Unyo Flutter app. Unyo Domain Data Layer is an agent skill from K3vinb5/unyo-app. How to create domain entities, data models, and repositories in the Unyo Flutter app.
Unyo Domain Data Layer fits situations like: adding new data types; creating repository interfaces; implementations; defining Freezed models.
Run `npx skills add K3vinb5/unyo-app --skill unyo-domain-data-layer -a claude-code`. Or copy the skill folder (.agents/skills/unyo-domain-data-layer in K3vinb5/unyo-app) into .claude/skills/unyo-domain-data-layer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add K3vinb5/unyo-app --skill unyo-domain-data-layer -a codex`. Or copy the skill folder (.agents/skills/unyo-domain-data-layer in K3vinb5/unyo-app) into .agents/skills/unyo-domain-data-layer 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 K3vinb5/unyo-app --skill unyo-domain-data-layer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/unyo-domain-data-layer, .gemini/skills/unyo-domain-data-layer, .github/skills/unyo-domain-data-layer and .opencode/skills/unyo-domain-data-layer in your project.
Going by SKILL.md and its folder, Unyo Domain Data Layer needs the command-line tools its instructions call (flutter).
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.
Unyo Domain Data Layer is published under the BSD-3-Clause licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Unyo Domain Data Layer: Code Review (flutter/flutter, 179k stars), Senior Architect Toolkit (maslennikov-ig/claude-code-orchestrator-kit, 260 stars), Code Review Skill (awesome-skills/code-review-skill, 2.1k stars) and Adding Release Notes (flutter/devtools, 1.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
K3vinb5 (a GitHub user) maintains it in K3vinb5/unyo-app, which has 664 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on June 12, 2026.
Source: K3vinb5/unyo-app on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.